【问题标题】:How to use class fields inside new statement using initializer syntax [duplicate]如何使用初始化语法在新语句中使用类字段[重复]
【发布时间】:2018-03-17 17:37:14
【问题描述】:

我有一个想要实例化的类。它包含两个字段,一个是String,另一个是Action。

在操作语句中,我想在我的类中使用字符串字段。但是,我不知道如何在实例化时直接调用它。有什么办法,还是我必须创建一个字段来包含实例化的类,然后调用文本?

public class ExampleClass
{
    public string text;
    public Action action;
    // on class instantiate -> action.Invoke();
}

public class Program
{
    static void Main(string[] args)
    {
        new ExampleClass
        {
            text = "Hello",
            action = () => { 
                 /* use the text element we specified to do something -> 
                    e.g Console.WriteLine(text); */ },
        };
        Console.ReadLine();
    }
}

尝试只使用text 字段(如action => ()=> {Console.WriteLine(text);})会导致错误:

CS0103 当前上下文中不存在名称“text”

【问题讨论】:

  • 如果您不输入变量,那么它会丢失在内存中,我们无法处理该内存位置
  • 旁注:“在类实例化 -> action.Invoke()” - 你知道初始化语法等同于设置属性 after 调用构造函数,不是吗?

标签: c#


【解决方案1】:

你不能。问题是,这实际上是一个闭包。您无权访问您以这种方式创建的实例的this,因此您需要“关闭”它。

您可以访问的this 实际上是您正在编写代码的类。在这种情况下,您没有一个,因为无论如何您都在一个静态函数中。

using System;

public class ExampleClass
{
    public string text;
    public Action action;
}


public class Program
{
    public static void Main()
    {
        var instance = new ExampleClass
        {
            text = "Hello"
        };
        instance.action = () => Console.WriteLine(instance.text);
        instance.action();
    }
}

【讨论】:

  • 我知道这是一种解决方案。我希望有另一种方式。
  • 不,我添加了更多详细信息来解释原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
相关资源
最近更新 更多