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)
这将导致更少的代码,我可以将我的方法设为私有。
然而,当该方法有参数时,我会遇到麻烦。
那么我该怎么做呢?这是不好的做法吗?如果这不是我应该做的,那我该怎么做?
我真的很想听听你们的意见!请不要犹豫,提出问题或更改我的问题。
另外,如果已经有人问过这个问题,我深表歉意。
任何很棒的教程也非常受欢迎!
一般的设计模式是:
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)
这说明您获得的“快速方式”的价值可能已经过时。