我知道有关于堆栈溢出的一些问题已经存在,但我没有找到任何回答我的具体问题.我来自java开发背景,从不打扰使用get; 组; 从C#到现在的方法.
我有以下代码
class Test
{
public int test { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在我的主要功能中,我可以声明一个新的测试和使用t.Test = 5,并且工作正常; 但是,当我切换public到private我无法访问我的获取; 并设定; 方法......但是当我使用时(与Java类似的方法)
class Test
{
private int test;
public int getTest()
{
return this.test;
}
public void setTest(int test)
{
this.test = test;
}
}
Run Code Online (Sandbox Code Playgroud)
我对设计理念感到困惑.在C#中我应该不再使用私有变量(只有在类内部使用时才将其设为私有)并将它们全部公开并使用私有get; 私人集; 控制可访问性?
当你写这篇文章时(为了清楚起见,我使用了不同的类和属性名称):
public class Test
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
那是要求编译器创建一个带有公共属性的私有字段.它相当于:
public class Test
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
(字段名称是自动生成的,不能直接在C#中表示.)
这基本上相当于你用Java编写的内容:
// Java
public class Test {
private String name;
public String getName() {
return name;
}
public String setName(String name) {
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
......但很明显C#更紧凑.
基本上,C#的属性使得代码比使用getter和setter方法作为常规方法更具可读性 - 但实际上它们就是这样.它们在代码中的使用方式不同.自动实现的属性(根据第一个片段)使"简单"属性更易于表达.在C#6中,您也可以编写只读自动实现的属性,这些属性可以从构造函数中分配,但只能分配给构造函数.
但重要的是,您仍然只是将属性作为公共API的一部分 - 而不是字段.因此,如果您以后想要添加更多逻辑(例如,从同一字段派生两个属性,或类似的东西),您可以这样做,而不会影响源或二进制兼容性.