6

我一直在使用 javascript,并且在函数内部大量使用了函数。我在 C# 中尝试过,但似乎它们不存在。如果我有以下情况:

public abc() {


}

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

4

7 回答 7

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在你的类上创建一个新方法并调用它。

于 2012-12-20T10:26:32.380 回答
3

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

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

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

仅当您引用该方法时才能调用该方法。如果您不将参考存储在其他地方,那么您应该没问题。


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

使用 aFunc而不是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

是的,它们被称为委托和匿名方法。

委托签名必须在要分配的主体的方法之外预定义,因此它与函数不完全一样。您将首先声明一个委托:

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 的一个有趣部分,但通常,控制访问的方法是在类中创建另一个方法,并将其声明为私有。如果您的问题是名称冲突,那么您可能需要重构。例如,您可以将原始类中声明的另一个类中的方法分组(支持嵌套类)或将它们完全移动到另一个类。

于 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 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

您可以创建一个嵌套类:

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 回答