得到设置属性用法

时间:2017-08-19 14:19:17

标签: c#

我对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用法的简单代码吗?

1 个答案:

答案 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