C# 如何使用匿名方法或匿名类型减少此代码?
我有一个web服务和一些方法,我不想使用下面的代码,因为我打算在静态(我已经读过)不是线程安全的多线程应用程序中使用这些代码 因此,我现在所做的只是在我的web服务方法“myWebMethod”的主体中,在第//1/3点、第//2/3点和第//3/3点重复下面静态方法“returnisTrue()”中的代码。这很好,但会导致代码膨胀。有没有一种更简洁的方法,使用函数式编程或匿名方法,或者我可以使用的其他方法 注意,当我试图在方法中创建一个类时,编译器阻塞了…这本可以解决我的问题 正如我所说的,我现在拥有的代码工作正常,但它过于臃肿,因为我重复了三次“静态”方法“returnisTrue” 多谢各位 编辑:为了回答一些关于使我的静态方法线程安全的问题,我不想麻烦这些问题,但是为了得到一个解决方案,我在下面介绍了这些问题 所有这些代码都是web服务中的服务器端代码C# 如何使用匿名方法或匿名类型减少此代码?,c#,static,thread-safety,anonymous-methods,C#,Static,Thread Safety,Anonymous Methods,我有一个web服务和一些方法,我不想使用下面的代码,因为我打算在静态(我已经读过)不是线程安全的多线程应用程序中使用这些代码 因此,我现在所做的只是在我的web服务方法“myWebMethod”的主体中,在第//1/3点、第//2/3点和第//3/3点重复下面静态方法“returnisTrue()”中的代码。这很好,但会导致代码膨胀。有没有一种更简洁的方法,使用函数式编程或匿名方法,或者我可以使用的其他方法 注意,当我试图在方法中创建一个类时,编译器阻塞了…这本可以解决我的问题 正如我所说的,我
// I cannot unfortunately use this static method below--not thread safe
static private bool returnisTrue()
{
bool isTrue = false;
// do a bunch of stuff here
return isTrue;
}
public bool myWebMethod (string XYZ)
{
//public Class myClassReturnisTrue { … } //will not compile
bool isTrueOrNot1 = returnisTrue(); //1 of 3
/// more code here
bool isTrueOrNot2 = returnisTrue(); //2 of 3
///more code here
bool isTrueOrNot3 = returnisTrue(); //3 of 3
return isTrueOrNot1 && isTrueOrNot2 && isTrueOrNot3;
}
// here is the static method 'returnisTrue' it looks something like this:
static private bool returnIsTrue(string A, string B)
{
if (A.Length() < B.Length())
{
return true;
}
else
return false;
}
//不幸的是,我不能使用下面的静态方法--这不是线程安全的
静态私有布尔返回函数()
{
布尔isTrue=假;
//在这里做一堆事情
回归真实;
}
公共bool myWebMethod(字符串XYZ)
{
//公共类myClassReturnisTrue{…}//将不会编译
bool isTrueOrNot1=returnisTrue();//第1个,共3个
///这里有更多代码
bool isTrueOrNot2=returnisTrue();//第2个,共3个
///这里有更多代码
bool isTrueOrNot3=returnisTrue();//3/3
返回isTrueOrNot1&&isTrueOrNot2&&isTrueOrNot3;
}
//下面是静态方法“returnisTrue”,它看起来像这样:
静态私有布尔返回函数(字符串A、字符串B)
{
如果(A.Length()
如果您锁定
关键部分(您可能想在msdn上查找它),您应该能够使用静态方法。如果您锁定
关键部分(您可能想在msdn上查找它),您应该能够使用静态方法。您在静态方法中实际做了什么?您是在修改任何全局状态还是只处理局部变量?使用静态方法,甚至变量都没有错,只要您采取适当的措施确保其中的代码实际上是线程安全的
静态方法和实例方法都可能是不安全的,这取决于您在它们内部执行的操作。要问的主要问题是,您是否正在访问方法中多个线程之间可以访问的任何数据?如果是这样,为什么不将方法更改为线程安全的(例如通过锁定)
以.NET framework本身为例,它始终包含各种静态线程安全方法
编辑:
好的,现在我们已经看到了您的方法——它确实已经是线程安全的了。该方法未访问任何共享数据,并且字符串被删除 在静态方法中,您实际上在做什么?您是在修改任何全局状态还是只处理局部变量?使用静态方法,甚至变量都没有错,只要您采取适当的措施确保其中的代码实际上是线程安全的 静态方法和实例方法都可能是不安全的,这取决于您在它们内部执行的操作。要问的主要问题是,您是否正在访问方法中多个线程之间可以访问的任何数据?如果是这样,为什么不将方法更改为线程安全的(例如通过锁定) 以.NET framework本身为例,它始终包含各种静态线程安全方法 编辑:
好的,现在我们已经看到了您的方法——它确实已经是线程安全的了。该方法未访问任何共享数据,并且字符串被删除 为什么不重构
returnisTrue
使之成为线程安全的呢?没有足够的信息来解决标题中的问题。@Richard--谢谢你的回答。我认为锁有性能代价——因为这种静态方法每秒会被评估几千次。从J.Kommer看来,静态方法是线程安全的。奇怪的是,C#没有简单的内联功能来解决这个问题。哦,好吧。。。这一次我很幸运。为什么不重构returnisTrue
以实现线程安全?没有足够的信息(没有可能的lambda或匿名类型)来解决标题中的问题。@Richard--谢谢你的回答。我认为锁有性能代价——因为这种静态方法每秒会被评估几千次。从J.Kommer看来,静态方法是线程安全的。奇怪的是,C#没有简单的内联功能来解决这个问题。哦,好吧。。。这一次我很幸运。@J.Kommer--好的,如果100万人访问这个静态方法,请看我的编辑。它是线程安全的吗?tx@J.Kommer--多谢各位。事实上,它们是MyWebMethod的局部变量。为什么它应该是线程安全的,这一点都不明显,但我相信你的话,并做更多的研究。从另一条评论来看,anon.methods作为解决方案似乎不明确,因此我将您的回答标记为答案。@J.Kommer--我不想将此作为关于字符串的教程,但我听说如果您处于循环中,您应该使用新的Stringbuilder()而不是字符串,因为字符串会消耗内存。然而,在这里,我假设即使静态方法每秒会被访问数千次,并且每次只会创建一个不可变字符串,这取决于您在循环中执行的操作,但我们并不是真正处于循环中。如果要执行大量字符串操作(例如