在访问器 C# 中调用方法

Sj0*_*3rs 3 c# oop methods accessor

所以我已经为此苦苦挣扎了一段时间。
我正在尝试学习面向对象编程,但它太大了,至少我很难理解所有内容。
假设我在一个类中有一个从数据库中获取某些内容的方法。
该数据将被设置为一个变量。
我现在要做的是有一个公共方法,调用它,然后使用该值调用访问器。例如:

        private string _name;

        public string Name { get { return _name; } }

        public void MyMethod()
        {
            using (SqlConnection connect = new SqlConnection(connectionString))
            {
                using (SqlCommand command = new SqlCommand("SELECT Name FROM Table WHERE ID = 1", connect))
                {
                    connect.Open();
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        if (reader.Read())
                        {
                            _name = Convert.ToString(reader["Name"]);
                        }
                    }
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

我会这样称呼它:

MyClass myclass = new MyClass();
myclass.MyMethod();
string myname = myclass.Name;
Run Code Online (Sandbox Code Playgroud)

现在这对我来说似乎很奇怪。
所以我想,也许在访问器内部调用方法是值得的。
喜欢:

public string Name { get { MyMethod(); return _name; } }
Run Code Online (Sandbox Code Playgroud)

像这样称呼它:

MyClass myclass = new MyClass();
string myname = myclass.Name;
Run Code Online (Sandbox Code Playgroud)

这将导致更少的代码,我可以将我的方法设为私有。
然而,当该方法有参数时,我会遇到麻烦。
那么我该怎么做呢?这是不好的做法吗?如果这不是我应该做的,那我该怎么做?

我真的很想听听你们的意见!请不要犹豫,提出问题或更改我的问题。
另外,如果已经有人问过这个问题,我深表歉意。
任何很棒的教程也非常受欢迎!

MrP*_*lch 5

您正在实施的是一种惰性形式, 有时称为缓存属性

一般的设计模式是:

private SomeType _value;
public SomeType CachedProperty {
     get {
          if(_value == null) {
              _value = GetValue(); // slow
          }
          return _value;
     }
}
Run Code Online (Sandbox Code Playgroud)

有几个原因不鼓励这种财产的概念:

  • GetValue() 通常很慢。这就是为什么我们首先兑现它的价值。所以访问该属性只是在第一次调用时很慢。但是我们希望属性总是快速的。

  • 当我们再次需要它时,兑现的价值可能已经过时了。这可以通过像UpdateValue. 但是我们希望属性始终是最新的。

  • 如果省略_value == null检查,则该属性将成为method的包装器。为什么我们要使用一个属性呢?

所以本质上,这种设计模式隐藏了一个事实,即潜在价值本质上是不稳定的,可能需要一些时间来恢复。

您是否真的想这样做,取决于您周围的代码的需求。

但总的来说,我只会采用典型的异步模式:

public SomeType GetValue() { ... }
public Task<SomeType> GetValueAsync() { ... }
Run Code Online (Sandbox Code Playgroud)

如果您确实需要在不同范围内使用缓存值,请添加:

public SomeType CachedValue { get; }
Run Code Online (Sandbox Code Playgroud)

这说明您获得的“快速方式”的价值可能已经过时。