6

私はJavaScriptを使用しており、関数内で関数を多く使用しました。これをC#で試しましたが、存在しないようです。私が以下を持っている場合:

public abc() {


}

d()メソッドの内部からしか呼び出せないメソッドをどのようにコーディングできabc()ますか?

4

7 に答える 7

5

メソッド レベルでのメソッドへのアクセス制限についてはあまり心配しませんが、より多くのクラス レベルでprivateは、メソッドのアクセスをその特定のクラスに制限するために使用できます。

別の代替手段は、ラムダ/匿名メソッドを使用するか、C# 4.0 を使用している場合はAction/Tasksメソッド内にそれらを作成することです。

特定の例でデリゲート (C# 1/2/3/4) を使用する匿名メソッドの例 (文字列パラメーターを取得して文字列を返すことができるアクションが必要ですか? を含む) は、次のようになります。

delegate string MyDelegate(string);

public void abc() {
    // Your code..

    MyDelegate d = delegate(string a) { return a + "whatever"; };
    var str = d("hello");
}

.. C# 3/4 を使用:

public void abc() {
    // Your code..

    Func<string, string> d = (a) => { return a + "whatever"; };
    var str = d("hello");
}

..privateメソッドによるより理想的なソリューションを使用する:

private string d(string a)
{
    return a + "whatever";
}

public void abc()
{
    // Your code..

    var str = d("hello");
}

別の回答に対するあなたのコメントに基づいて:これをメソッドの一番下に置き、それを以前のコードから呼び出したいと思います。

これは不可能です。デリゲートまたはいずれかを使用してメソッドの変数を定義する必要があるため、Actions呼び出すまでに完全に初期化する必要があります。メソッドの最後でこれを定義することはできません。はるかに優れたオプションはprivate、クラスに新しいメソッドを作成して呼び出すことです。

于 2012-12-20T10:26:32.380 に答える
3

別のメソッド内でメソッドを宣言することはできませんが、メソッド内で無名関数を作成できます。

public void abc()
{
    Action d = () => { ... };
    // ...
    d();
}

...メソッド abc() 内からのみ呼び出すことができますか?

メソッドへの参照がある場合にのみ、メソッドを呼び出すことができます。参照を別の場所に保存しない場合は、問題ありません。


アクションに文字列を渡して返すにはどうすればよいですか?

Funcの代わりにa を使用しActionます。

Func<string, string> d = s => {
    return s + "foo";
};

これを行う理由は、コードを読みやすくするためです。

コードを読みやすくするのは良いことですが、この変更により読みにくくなると思います。無名関数ではなく、通常のメソッドを使用することをお勧めします。クラスの外から呼び出されないように、それらを非公開にすることができます。

于 2012-12-20T10:24:04.863 に答える
3

クラスを定義する方法ではありませんが、次のことができます。

public abc() {
    Action d = () => {
        // define your method
    };

    d();
}
于 2012-12-20T10:25:12.370 に答える
2

アクション デリゲートを使用します。あなたよりも効果的です。

public abc() {

         Action <int> GetInt = (i) => 
         {
            //Write code here
            Console.Writeline("Your integer is: {0}", i);
         };

         GetInt(10);
}

Actionはデリゲートであるため、変数ではなくメソッドとしてパラメーターを指定できます。アクション デリゲートは、パラメーターを持たず、値を返さないメソッドをカプセル化します。MSDN から確認してください。

于 2012-12-20T10:27:15.827 に答える
2

はい、デリゲートおよび匿名メソッドと呼ばれます。

デリゲート シグネチャは、ボディを割り当てるメソッドの外部で事前定義する必要があるため、関数とはまったく異なります。最初にデリゲートを宣言します。

class MyClass {
    public delegate boolean Decider(string message);

    /* ... */
}

そして inMyClass.MyMethodと言っDecider IsAllLowerCase = /* method name or anonymous method */;て、 で使うことができますvar result = IsAllLowerCase(s);

幸いなことに、.NET には、必要になる可能性のあるほとんどのシグネチャのデリゲート定義が既に用意されています。System.Action何も返さないメソッドと、返すメソッド用のさまざまなシグネチャがありSystem.Funcます。

他の場所で示されているように、

Action<int, string> a = (n, s) => { for(var i=0; i<n; i++) Console.WriteLine(s);};

a( /* inputs */ );ローカル変数であるかのように呼び出すことができます。(stuff) => { code }「ラムダ式」または匿名メソッドの場合、メソッドの名前を渡すこともできます (署名が一致する場合):

Action<string> a = Console.WriteLine;

何かを返したい場合は、次を使用しますFunc

Func<bool, string> f = (b) => { return b.ToString(); };

var result = f(b);同じ方法で呼び出すことができます。


脚注として、デリゲートは C#/.NET の楽しい部分ですが、通常、アクセスを制御する方法は、クラス内に別のメソッドを作成し、それをプライベートに宣言することです。問題が名前の競合である場合は、リファクタリングすることをお勧めします。たとえば、元のクラス内で宣言された別のクラスのメソッドをグループ化したり (ネストされたクラスがサポートされています)、別のクラスに完全に移動したりできます。

于 2012-12-20T10:23:55.750 に答える
2

アクションデリゲートを使用できます

public abc() {

         Action action = () => 
         {
            //Your code here
         }

         action();
}

編集:パラメータを渡すには

public abc() {

   Action <string>action = (str) =>
        {
            //Your code here                
        };
}   
action("hello");

Func値を返すために使用する

public void abc() {  

    Func<string, string> func = (str) => { return "You sent " + str; };
    string str = func("hello");
}
于 2012-12-20T10:24:24.320 に答える
2

ネストされたクラスを作成できます:

public class ContainingClass
{
    public static class NestedClass
    {
        public static void Method2()
        {
        } 

        public static void Method3()
        {
        }
    }
}

次に、次のように呼び出すことができます。

ContainingClass.NestedClass.Method2();

また

ContainingClass.NestedClass.Method3();

私はこれをお勧めしません。通常、入れ子になったパブリック型を使用することはお勧めできません。

于 2012-12-20T10:27:16.273 に答える