我对C#中的get set属性有点困惑。
我有以下简单的代码:
using System;
class Example
{
int _number;
public int Number
{
get
{
return this._number;
}
set
{
this._number = value;
}
}
}
class Program
{
static void Main()
{
Example example = new Example();
example.Number = 5; // set { }
Console.WriteLine(example.Number); // get { }
}
}
上面的代码使用get set属性。但是,如果我删除了如下代码的get set代码,结果保持不变。
using System;
class Example
{
int _number;
public int Number;
{
}
}
class Program
{
static void Main()
{
Example example = new Example();
example.Number = 5; // set { }
Console.WriteLine(example.Number); // get { }
}
}
我的查询是,用于获取集的代码是什么?在上面的程序中,结果是一样的。你能给我一些显示get set用法的简单代码吗?
答案 0 :(得分:1)
在您的代码中,Number
只是一个公共字段,最后用分号(;
)表示。
public int Number;
它不是属性,你只是在下面有一组空的括号,这导致你的混乱。如果您要删除;
,那么您实际上会有一个缺少get
的属性,并且根本无法编译。
所有属性都需要有一个getter(setter是可选的)。如果你想避免写它们,你可以使用auto properties来处理后备字段,而不必参与其中:
public int Number { get; set; } // No field required
注意:您将看到涉及自动属性的常见用法模式如下:
public int Number { get; private set; }
这允许可以从任何地方读取的属性,但只能在它们所属的类中进行修改。
编辑:要回答您的问题,字段和属性之间的主要区别在于封装。您可以阅读有关字段和属性here之间的一般差异的更多信息。
但是,您提供的示例还有一个区别,即private set
。可以在整个程序中写入正常字段。但是,具有私有setter的属性只能从它所属的类内部进行修改。
示例:
public class Foo
{
public int Id { get; private set; }
public string Name;
public Foo()
{
this.Id = 1; // This works!
}
}
此处,Name
是字段,Id
是具有私有设置器的属性。请注意,我们在构造函数中修改Id
并且它有效,因为它属于类Id
所属的类。然而,走出课堂:
var foo = new Foo();
// Field (no get and set):
foo.Name = "test" // Works
string bar = foo.Name; // Works
// Property (get and *private* set)
int i = foo.Id; // Works, because get is public
foo.Id = 2; // Doesn't work, because set is private