如何通过二传手设置属性

时间:2019-02-18 12:41:36

标签: c#

我在学校里教过C#。我们做了一些基本的事情,例如循环,如果有的话。

现在,我们对OOP做更多的工作。老师对我们说了一些关于自动实现的属性,我觉得这个功能很棒。但是我很好奇如何通过方法设置属性值。

当我们不知道自动实现的属性时。我们总是做一个方法来设置或获取类的值。 但是,当我使用自动实现的属性时,我看不到任何获取或设置类实例的值的方法。因此,当只能通过构造函数设置值时,如何设置类的某些属性的值。我想知道,因为当属性为私有时,我只能通过构造函数设置它,这不是问题,但是当我想通过Console.Readline()设置值时可以做什么。 ?

namespace _001_dedicnost
{    
    class Car
    {        
        int Size { get; set; }                              
    }
    class Program
    {
        static void Main(string[] args)
        {
            Car car1 = new Car(5);
            // but the following line wont work
            car1.Set(51);
        }
    }
}

4 个答案:

答案 0 :(得分:1)

您的Car类具有PRIVATE属性Size,因此您无法从您的代码中访问它,只能从CAR类中访问

如果要为此属性设置值,则必须将其声明为PUBLIC:

 class Car
        {
            public int Size { get; set; }
        }

        static void Main(string[] args)
        {
            Car car1 = new Car();
            car1.Size = 1;
        }

答案 1 :(得分:0)

将属性放在表达式的左侧时,将自动使用表达式的右侧作为值在set方法上调用set方法。

因此car1.Size = 51就像为value为51的Size属性调用扩展的setter一样。

答案 2 :(得分:0)

public class Point {
    public int X { get; set; } = 0;
}

等效于以下声明:

public class Point {
    private int __x = 0;
    public int X { get { return __x; } set { __x = value; } }
}

这意味着您“在使用“ =”符号调用的c尖锐编译器下有一对“方法””

Point p = new Point();
p.X = 10; //c# compiler would call something like p.__set_X(10)
int i = p.X; //c# compiler would call something like int i = p.__get_X();

了解有关自动属性https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#automatically-implemented-properties

的更多信息

我不建议使用它-它破坏了代码的可读性和可读性;(

答案 3 :(得分:0)

如果该类是简单的贫血模型(没有逻辑),请将属性设置为public,它将起作用。

如果您要控制不变量(业务规则),则希望有一个public Size { get; private set; }和一个public void SetSize(int size) { /* ... */ },其中包含您的业务规则。

以下是C#中通常使用的三种“模式”:

// Anemic domain model (simple entity)
public class Car
{
    public int Size { get; set;}
}

// Domain model with business rules
public class Car
{
    public int Size { get; private set; }

    public void SetSize (int size)
    {
        // check to make sure size is within constraints
        if (size < 0 || size > 100)
            throw new ArgumentException(nameof(size));

        Size = size;
    }
}

// Value object
public class Car
{
    public Car (int size) 
    {
        // check constraints of size
        Size = size;
    }
    public int Size { get; }
}