我一直在使用 javascript,并且在函数内部大量使用了函数。我在 C# 中尝试过,但似乎它们不存在。如果我有以下情况:
public abc() {
}
如何编写d()
只能从方法内部调用的方法abc()
?
我不会太担心在方法级别上限制对方法的访问,但在更多的类级别上,您可以使用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
在你的类上创建一个新方法并调用它。
你不能在另一个方法中声明一个方法,但你可以在方法中创建匿名函数:
public void abc()
{
Action d = () => { ... };
// ...
d();
}
...只能从方法 abc() 内部调用?
仅当您引用该方法时才能调用该方法。如果您不将参考存储在其他地方,那么您应该没问题。
如何将字符串传递并返回给操作?
使用 aFunc
而不是Action
:
Func<string, string> d = s => {
return s + "foo";
};
我想这样做的原因是让我的代码更具可读性。
尝试使您的代码更具可读性是件好事,但我认为这种更改会降低其可读性。我建议你使用普通方法,而不是匿名函数。您可以将它们设为私有,以便无法从您的班级外调用它们。
这不是定义类的方法,但你可以这样做:
public abc() {
Action d = () => {
// define your method
};
d();
}
是的,它们被称为委托和匿名方法。
委托签名必须在要分配的主体的方法之外预定义,因此它与函数不完全一样。您将首先声明一个委托:
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 的一个有趣部分,但通常,控制访问的方法是在类中创建另一个方法,并将其声明为私有。如果您的问题是名称冲突,那么您可能需要重构。例如,您可以将原始类中声明的另一个类中的方法分组(支持嵌套类)或将它们完全移动到另一个类。
您可以使用操作委托
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");
}
使用动作委托。比你做的更有效。
public abc() {
Action <int> GetInt = (i) =>
{
//Write code here
Console.Writeline("Your integer is: {0}", i);
};
GetInt(10);
}
Action
是一个委托,因此您可以将参数作为方法而不是变量提供。动作委托封装了一个没有参数且不返回值的方法。从 MSDN 检查它。
您可以创建一个嵌套类:
public class ContainingClass
{
public static class NestedClass
{
public static void Method2()
{
}
public static void Method3()
{
}
}
}
然后你可以打电话:
ContainingClass.NestedClass.Method2();
或者
ContainingClass.NestedClass.Method3();
我不会推荐这个。通常,拥有公共嵌套类型是个坏主意。