我一直在使用javascript,我在函数内部使用了很多函数。我在C#中试过这个,但似乎它们不存在。如果我有以下内容:
public abc() {
}
如何编写只能被调用的方法d()
从方法内部方法abc()
?
答案 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();
我不建议这样做。通常,拥有公共嵌套类型是个坏主意。