Getter和Setter与类方法[复制]

问题描述 投票:1回答:3

这个问题已经在这里有一个答案:

我问一个推荐使用getter和setter。我写了相同的代码有两种版本:使用getter和setter,并只使用类方法。我不能清楚地看到它们之间的区别。

我与私营领域的评价写的类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。

c# getter-setter
3个回答
4
投票

getter和setter方法只是语法糖。编译器将编译你的getter和setter到getter和setter方法最终。因此,通过自己编写getter和setter方法,你是那种做编译器的工作。

因此,我建议你使用getter和setter,因为他们的主要目的之一是取代getter和setter方法。

下面是使用getter和setter的其他一些优点:

  • getter和setter可以,如果你只需要getter和setter方法没有任何逻辑为您节省大量的时间: public int Property { get; set; }
  • IMO,getter和setter的美学效果更好。相比: obj1.Property += obj2.Property; obj1.SetProperty(obj1.GetPropert() + obj2.GetProperty()); 我觉得后者只是有太多的括号...
  • 不断接近财产申报的getter和setter方法。如果您使用的getter和setter方法,你可能会不小心写了财产申报和getter / setter方法之间的其他方法,导致getter / setter方法来慢慢从财产申报“渐行渐远”。你想找到它下一次,你需要上下滚动。随着getter和setter,他们将永远是财产申报的下方。

1
投票

Microsoft

属性是,提供了一个灵活的机制来读,写,或计算私有字段的值的构件。

这基本上是他们的话说,属性是特定目的建造的成员,在纯粹的包装和访问私有成员,使之道“的数据可以很容易地访问,并仍然有助于促进的方法的安全性和灵活性。”

在你的榜样,我会重新命名RatingSetter只是Rating和对待它,就好像你将一个正常的公共领域。这促进了易用性,当其他人使用你的代码减轻混乱。这是比较明显的,需要做的事情,你在做什么。

这也是不可取的,有公共领域,e.g public string title;相反,它通常是更好的选择使用属性来包装这个领域并使其私人例如

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

然后,您可以使用公共财产类之外,但现在有超过当有人访问或设置变量会发生什么更多的控制。

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

这将只允许读取外部类的访问。

日志是现在更容易,因为你可以在setter方法实现:

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

所以总结一下,属性是简洁,功能明显,像场,但所有的力量和方法的灵活性。


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
    }
© www.soinside.com 2019 - 2024. All rights reserved.