将变量赋值给表达式C#

Sam*_*mi3 -4 c#

是否可以在C#中为表达式赋值,以便我不必为它编写方法?例如,名为canBuild的变量等于表达式"numResources> 50".无论何时调用该变量,它都会重新计算它的值.我已经尝试过研究lambda,但我并不真正理解文档.

谢谢

编辑:

这是我尝试使用lamdas的尝试:

public void setStateFloat(float variable, float comparison, int compareType)
{
    Func<bool> stateEval;
    switch(compareType)
    {
        case 0:
            stateEval = () => variable < comparison;
            break;
        case 1:
            stateEval = () => variable > comparison;
            break;
        case 2:
            stateEval = () => variable == comparison;
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果变量和比较不是使用此函数的对象本地(如在引用另一个对象变量的对象中),这是否有效.我怀疑它,因为它只是变量的副本,而不是指向原始变量存储位置的指针/引用.

另外,如果我想存储对该函数的引用,我该怎么做?

这背后的原因是我正在为设计人员开发一个高度结构化的模块化系统,其中一个要求是从他们的输入创建一个最初计算然后在运行时使用的函数.欢迎采用其他方法.

好的谢谢.

mbj*_*mbj 5

您将无法完全避免方法的概念,但C#lambda表达式为创建可以按照您建议的方式使用的匿名函数提供了一个很好的干净语法.在您的示例中,表达式没有输入参数,因此看起来像这样:

() => numResources > 50
Run Code Online (Sandbox Code Playgroud)

这里,numResources指的是在代码中的其他地方声明的变量,但在创建匿名函数的范围内可见.这导致在一个封闭numResources,这在C#意味着该匿名函数可以在任何时间访问该变量,即使函数是从其中一个位置调用numResources通常不是可用的.

现在,为了将匿名函数分配给变量以便可以多次计算或在方法之间传递,必须使用委托类型.这些天,代理通常使用Func <TResult,...>Action <...>类型之一声明.

由于示例表达式没有参数并返回a bool,因此您将变量声明为类型Func<bool>.在单个语句中组合声明和初始化,这变为:

Func<bool> canBuild = () => numResources > 50;
Run Code Online (Sandbox Code Playgroud)

请注意,需要显式声明类型,var此处不起作用.现在你有一个变量canBuild,你可以使用它,就好像它是一个方法的名字:

bool result = canBuild();
Run Code Online (Sandbox Code Playgroud)

// Declare and initialize numResources
int numResources = 42;

// Declare and initialize a delegate and the anonymous function
Func<bool> canBuild = () => numResources > 50;

// Invoke the function    
bool result = canBuild();  // False this time, since 42 < 50

// Update numResources
numResources = 75;

// Invoke the function again 
bool result = canBuild();  // True this time
Run Code Online (Sandbox Code Playgroud)

关闭局部变量的示例

下面的示例演示了C#闭包如何使变量共享,以便匿名函数实际引用原始变量,而不仅仅是副本:

    class Program
    {
        public static void CreateAnonFuncs(out Func<int> getNumber, 
                                           out Action<int> setNumber)
        {
            // Declare a local variable
            int localNum = 42;

            // Create anonymous functions that reference the local variable
            getNumber = () => localNum;
            setNumber = (n) => { localNum = n; };

            // Let's update the local variable afterwards
            localNum = 21;
        }

        public static void Main()
        {
            // Call the method that creates the functions
            CreateAnonFuncs(out var getter, out var setter);

            // Now invoke the functions to prove that the variable is shared
            Console.WriteLine($"Value from getter: {getter()}"); // 21 (not 42)
            setter(99);
            Console.WriteLine($"New value from getter: {getter()}"); // 99 (not 21)
        }
    }
Run Code Online (Sandbox Code Playgroud)