你可以使用简写方式定义一个“新”的属性吗?

4

最近我一直在将一些代码从VB转换为C#,我发现在VB中,您可以使用速记方式初始化新对象,那么在C#中是否也可以这样做,还是必须使用支持字段呢?

Public Property MyList As New List(Of String)

看起来,C# 的等效语句是:

private List<String> _myList = new List<string>();
public List<String> MyList
{
    get { return _myList; }
    set { _myList = value; }
}

注意*使用快捷命令“propfull”可以更轻松地编写此内容。

1
简短回答:不,这行代码无法直接转换成C#语言。您不能在同一行上初始化和定义属性。 - qJake
这可能是一个重复的问题,尽管它没有提到VB.NET:初始化C#自动属性 - Tim Schmelter
@TimSchmelter 同意,但可能不应该被关闭为重复,因为这个问题涉及从VB到C#的迁移,而那个问题没有涉及。 - qJake
可能是重复的问题:如何为C#自动属性设置默认值? - nawfal
3个回答

8

C# 的等价语句是什么?

C# 也支持自动实现的属性,它不需要后备字段但不会自动为该属性分配值:

public List<string> MyList { get; set; }

编译器将会生成相应的后备字段。你还可以为getter和setter指定不同的访问修饰符:
public List<string> MyList { get; private set; }

如果你想使用自动属性来同时实例化属性,那么不好意思,这是不可能的。但是你可以在类的构造函数中完成实例化操作:

public class MyClass
{
    public MyClass()
    {
        this.MyList = new List<string>();
    }

    public List<string> MyList { get; set; }
}

5
在C#中,您无法同时创建并初始化一个属性(property)。只有使用字段(fields)才能这样做。
下面这种方式是合法的,但是不会初始化变量的值(MyList将会为null):
public List<string> MyList { get; set; }

这是有效的(但它是一个字段,而不是一个属性):

public List<string> MyList = new List<string>();

这是无效的

public List<string> MyList { get; set; } = new List<string>();

在类中创建属性,然后在该类的构造函数中进行初始化是很常见的做法。


更新:这在C# 6.0中现在是有效的语法。


1
这在C# 6.0中是有效的 :) - nawfal

-1
在C#中,只需执行以下操作:
public List<string> MyList { get; set; }

1
这并不会像 OP 的代码那样自动创建新的列表。 - Robert Harvey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接