我有一个名为Themes的类,它跟踪要在其他类中使用的颜色。该类包含各种不同的颜色,这些颜色根据日期而变化。
public class Themes
var textColor;
var contentColor;
updateTheme()
{
updates colors
}
我有两种方法可以访问这些字段。
theme = new Theme()
textColor = theme.textColor
或
theme = new Theme()
textColor = theme.GetTextColor()
样式类至少有20个字段。我知道两种方式都有效,我想知道哪种方法更好。 (将这些字段公开并将它们全部设为公开可以被认为是可以的吗?还是写20个GetMethods?)
答案 0 :(得分:0)
您可以使用第一种方式(似乎使用属性),但就个人而言,我可能会这样做。
public enum ThemeColor
{
TextColor,
BackgroundColor,
// Etc.
}
public ??? GetColor(ThemeColor color)
{
// Return the requested color here
}
虽然这有点冗长。
textColor = theme.GetColor(ThemeColor.TextColor);
它可以使您的实现更简单。例如,您的颜色可能存储在数组或List<>
中。因此,您可以将枚举转换为有效充当数组索引的整数。编写二十种方法或属性要简单得多。
我也觉得这种方法很可读。
答案 1 :(得分:0)
您应该使用的语言功能是属性。这些语法看起来像消耗代码的字段,但您可以实现自定义逻辑以获取或设置实现中的值。您也可以将它们限制为只读或写入(非常罕见)。
请参阅Microsoft C#编程指南:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/properties
语法就像这样写:
public class Foo {
public Foo(int bar, string baz) {
Bar = bar;
Baz = baz;
}
public int Bar { get; set; } //Read/write property
public string Baz { get; } //Readonly
public bool IsFooEven {
get { return Bar % 2 == 0; } //Calculated property
}
}
消费者会看到这一点:
var foo = new Foo(5, "abc");
var bar = foo.Bar; //returns 5
var baz = foo.Baz; //returns "abc"
foo.Baz = "xyz"; //sets value
属性实际上是围绕编译程序集中的字段的get_Bar()
和set_Bar(int value)
方法实现的,但C#使它们更好用。