C#在方法中是否有方法概念?

时间:2012-12-20 10:22:30

标签: c# .net methods delegates

我一直在使用javascript,我在函数内部使用了很多函数。我在C#中试过这个,但似乎它们不存在。如果我有以下内容:

public abc() {


}

如何编写只能被调用的方法d() 从方法内部方法abc()

7 个答案:

答案 0 :(得分:5)

我不太担心在方法级别上限制访问方法但是更多的类级别,您可以使用private来限制方法对该特定类的访问。

另一种方法是使用lambdas /匿名方法,或者如果你使用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方法并调用它。

答案 1 :(得分:3)

您不能在另一个方法中声明方法,但可以在方法中创建匿名函数:

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

  

...只能从方法内部调用方法abc()?

只有在您引用该方法时才能调用该方法。如果你没有在其他地方存储引用,那么你应该没事。


  

如何传递并将字符串返回给操作?

使用Func代替Action

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

  

我想这样做的原因是为了让我的代码更具可读性。

尝试使代码更具可读性是好的,但我认为此更改将使更少可读。我建议你使用普通方法,而不是匿名函数。您可以将它们设为私有,这样就无法从课堂外调用它们。

答案 2 :(得分:3)

这不是定义类的方法,但你可以这样做:

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

    d();
}

答案 3 :(得分:2)

是的,它们被称为代理和匿名方法。

委托签名必须预先外部分配正文的方法,因此它不像函数。您首先要声明一个委托:

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

    /* ... */
}

然后在MyClass.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 }是“lambda表达式”或匿名方法,您也可以只传递方法名称(如果签名匹配):

Action<string> a = Console.WriteLine;

如果您想要退货,请使用Func

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

允许您以相同的方式拨打var result = f(b);


作为脚注,代表是C#/ .NET的有趣部分,但通常,控制访问的方法是在类中创建另一个方法,并将其声明为私有。如果您的问题是名称冲突,那么您可能想要重构。例如,您可以将原始类中声明的另一个类中的方法分组(支持嵌套类)或将它们完全移动到另一个类。

答案 4 :(得分:2)

您可以使用action个代表

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");
}

答案 5 :(得分:2)

使用操作代理。比你更有效。

public abc() {

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

         GetInt(10);
}

Action是一个委托,因此您可以将参数作为方法而不是变量。 Action delegate封装了一个没有参数且不返回值的方法。从MSDN查看。

答案 6 :(得分:2)

您可以创建嵌套类:

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

        public static void Method3()
        {
        }
    }
}

然后你可以打电话:

ContainingClass.NestedClass.Method2();

ContainingClass.NestedClass.Method3();

我不建议这样做。通常,拥有公共嵌套类型是个坏主意。