Getters和Setters与类方法

时间:2019-02-03 13:19:55

标签: c# getter-setter

我在问有关使用吸气剂和吸气剂的建议。 我在两个版本中编写了相同的代码:使用getter和setter以及仅使用class方法。而且我看不清它们之间的区别。

我用私人领域评分写了Book类。构造函数Book可以通过RatingSetter或RatingMethod将某些东西分配给Book.rating。 RatingMethod仅设置值,但我也可以创建仅用于获取值的方法。

class Book
    {
        public string title;
        public string author;
        private string rating;

        public Book(string title, string author, string rating)
        {
            this.title = title;
            this.author = author;
            RatingSetter = rating;
            RatingMethod(rating);
        }

        public string RatingSetter
        {
            get { return this.rating; }
            set
            {
                if (value == "PG" || value == "PG-13" || value == "R")
                {
                    rating = value;
                }
                else
                {
                    rating = "NR";
                }
            }
        }

        public string RatingMethod(string rating)
        {
            if (rating == "PG" || rating == "PG-13" || rating == "R")
            {
                return this.rating = rating;
            }
            else
            {
                return this.rating = "NR";
            }
        }
    }

我认为,安全性,验证或其他方面没有任何区别。 任何人都可以指导并帮助我了解有什么区别,以及为什么建议使用getter和setter方法。

3 个答案:

答案 0 :(得分:4)

字母和字母是语法糖。编译器最终会将您的getter和setter编译为getter和setter 方法。因此,通过自己编写getter和setter方法,您就可以完成编译器的工作。

因此,我建议您使用getter和setter,因为它们的主要目的之一是替换getter和setter方法。

还有使用getter和setter的其他一些优点:

  • 如果您只需要没有任何逻辑的吸气剂和装夹器,则字母和设定器可以为您节省很多时间:

    public int Property { get; set; }
    
  • 海事组织(IMO),吸气剂和吸气剂的美观性更好。比较:

    obj1.Property += obj2.Property;
    

    使用

    obj1.SetProperty(obj1.GetPropert() + obj2.GetProperty());
    

    我觉得后者只是括号太多了...

  • 使设置方法和获取方法靠近属性声明。如果使用getter和setter方法,则可能会意外地在属性声明和getter / setter方法之间编写其他方法,从而导致getter / setter方法缓慢地“漂离”属性声明。下次要查找它时,需要上下滚动。使用getter和setter,它们将始终位于属性声明下方。

答案 1 :(得分:1)

Microsoft

  

属性是提供灵活机制以读取,写入或计算私有字段值的成员。

从本质上说,属性是一个有目的的成员,仅用于包装和访问私有成员,从而使“数据易于访问,并且仍有助于提高方法的安全性和灵活性。” / p>

在您的示例中,我将简单地将RatingSetter重命名为Rating,并像对待普通公共领域一样对待它。这样可以提高易用性,并减少其他人使用您的代码时的混乱。很明显,您在做什么和需要做什么。

也不建议设置公共字段,例如public string title; 相反,通常最好选择使用属性来包装此字段并将其设为私有,例如

private string title;
public string Title {get; set;}

您可以在班级之外使用公共属性,但是现在可以更好地控制某人访问或设置变量时的情况。

private string title;
public string Title {get; private set;}

仅允许从类外部进行读取访问。

现在可以更轻松地记录日志了,因为您可以在设置器中实现它:

private string title;
public string Title 
{
    get{ return title;}
    set
    {
        // Logging Code Here
        title = value;
    }
}

总而言之,属性很简洁,功能很明显,就像一个字段一样,但是具有方法的所有功能和灵活性。

答案 2 :(得分:0)

功能相同。但是,它使代码更具可读性和可理解性。

在您的示例中,您通过调用ratingRatingSetter来验证RatingMethod。考虑到您在团队中工作,而您的同事并不了解验证方法,只需致电this.rating = someValue。对于您的示例,将没有任何验证。我的代码示例(未经测试)确保对每个分配的值都进行验证。

private string rating {
     get { return this.rating; }
        set
        {
            if (value == "PG" || value == "PG-13" || value == "R")
            {
                rating = value;
            }
            else
            {
                throw new UnknownRatingException();

            }
        }
}

public Book(string title, string author, string rating)
    {
        this.title = title;
        this.author = author;
        this.rating = rating //the set property is called
    }