C#:通过方法在构造函数中设置属性
我开始理解C#和OOP,有一个我似乎无法解决的问题。我有一个名为DataSet的类,它应该包含几个属性(以System.Collections.Generic.Dictionary对象的形式)。在类中,我有从数据库加载数据的方法,这些方法应该用于初始化数据集。基本上,当我从Main方法实例化DataSet对象时,我希望它设置所有属性 我的资料如下(略去细节):C#:通过方法在构造函数中设置属性,c#,properties,constructor,C#,Properties,Constructor,我开始理解C#和OOP,有一个我似乎无法解决的问题。我有一个名为DataSet的类,它应该包含几个属性(以System.Collections.Generic.Dictionary对象的形式)。在类中,我有从数据库加载数据的方法,这些方法应该用于初始化数据集。基本上,当我从Main方法实例化DataSet对象时,我希望它设置所有属性 我的资料如下(略去细节): 公共类数据集 { 公共IDictionary属性1{get;set;}; 公共IDictionary属性2{get;set;}; 公共I
公共类数据集
{
公共IDictionary属性1{get;set;};
公共IDictionary属性2{get;set;};
公共IDicToAnry属性3{get;set;};
公共数据集()
{
Property1=新字典();
Property2=新字典();
Property3=新字典();
//设置属性1
//设置属性2
//设置属性3(仅当属性1已知时才能执行)
}
私有void GetProperty1(/*某物?*/)
{
//从数据库加载数据。
}
专用静态字典GetProperty1替代(数据集)
{
//同样的事情,但静态的,所以需要实例引用。
}
//类似地,对于不动产2和不动产3
}
我想要的是在构造函数中设置属性。我的问题基本上是:
非常感谢您的帮助。您的代码中有一些问题。您已将属性公开,因此也使用GetProperty1没有任何意义。另一种方法是将字典设置为私有变量,这样您就可以:
public IDictionary<string,MyClass1> GetProperty1()
{
if ( _property1 == null )
{
_property1 = LoadFromDatabase();
}
return _property1;
}
公共IDictionary GetProperty1()
{
if(_property1==null)
{
_property1=LoadFromDatabase();
}
归还财产1;
}
同样,对于property3,您也可以在创建并返回ProeProperty1之前检查ProeProperty1是否不为null,但您还需要决定要执行的操作(首先自动加载属性1,或者为property3返回null)您可以使用以下代码。它可以解决几个问题
public class DataSet
{
private DataSet()
{
}
public DataSet _instance = null;
public static DataSet Instance
{
get{ if (_instance = null){_instance = new DataSet();}return _instance;}
}
private IDictionary<string, MyClass1> _property1 = null;
public IDictionary<string, MyClass1> Property1
{
get
{
result = _property;
if (result == null)
{
//read database
}
return result;
}
}
公共类数据集
{
私有数据集()
{
}
公共数据集_实例=null;
公共静态数据集实例
{
获取{if(_instance=null){u instance=new DataSet();}返回_instance;}
}
私有IDictionary _property1=null;
公共索引属性1
{
得到
{
结果=_属性;
如果(结果==null)
{
//读取数据库
}
返回结果;
}
}
为什么不添加一个公共函数,例如LoadData()可以在构建对象后调用。这可以使用正确的顺序加载所有数据。我想你甚至可以在构造函数中调用它。我也会按照Lukos的建议,使用public get属性创建一些私有成员变量。我觉得你需要加载字典,然后ant来缓存它。您可以在属性getter中惰性地执行此操作:
public class DataSet
{
private IDictionary<string, MyClass> property;
public IDictionary<string, MyClass> Property
{
if (property == null)
{
property = LoadProperty();
}
return property;
}
}
您可以简单地执行以下操作:
anIntance.Property;
我现在所做的一切是正确的吗
我想很多人把你的Get
函数混淆为传统的“getter”,所以你应该重新命名它
如果是,我应该将我的方法设置为静态(并通过引用方法传递实例),这将要求类DataSet是静态的(及其所有属性),还是有一种方法可以在不设置DataSet静态的情况下执行我正在执行的操作
您可以使方法实际上加载数据是静态的,并且不需要传递实例-您只需返回数据即可(我更改了函数名)。从实例/构造函数调用静态方法是可以的,但不需要反过来
public DataSet()
{
Property1 = LoadProperty1();
Property2 = LoadProperty2();
Property3 = LoadProperty3();//can only be done when Property1 is known
}
private static Dictionary<string, MyClass1> LoadProperty1()
{
// load data
}
公共数据集()
{
Property1=LoadProperty1();
Property2=LoadProperty2();
Property3=LoadProperty3();//仅当Property1已知时才能执行
}
私有静态字典LoadProperty1()
{
//加载数据
}
一个重要的问题是,只有当Property1已知/设置后才能设置Property3。我不知道这是否可能
正如您所看到的,这在上面的代码中得到了解决。您为什么考虑将
GetProperty1
设置为静态?谢谢,Lukos。您所说的“您已将属性公开,因此也使用GetProperty1实际上没有意义”到底是什么意思?我希望属性是公共的,这样我可以在其他代码中访问它们,GetProperty方法应该加载它们。你的方法的优点是什么?延迟加载的思想是只在需要时加载数据。我描述的方法只加载一次数据(如果尚未加载),然后将字典返回给用户。因此,您不需要属性,只需调用此方法即可访问它们。延迟加载并不总是最佳选择,但它可以避免在应用程序每次运行时都加载可能不需要的大量数据。很酷,我不知道这一点!设置属性的延迟或急切方式是否有普遍的偏好?我发现急切加载稍微干净一点,因为您不需要私有备份属性。但是如果(1)您不知道您将需要属性,或者(2)您不希望对象构造花费太多时间,您通常会进行惰性加载。非常好的建议,各位!谢谢。是的,GetProperty方法不是传统的get函数。我将重命名它们(在我的代码中),
private static Dictionary<string, MyClass1> GetProperty1Alternative(DataSet dataSet)
DataSet.GetProperty1Alternative(anInstance);
anIntance.Property;
public DataSet()
{
Property1 = LoadProperty1();
Property2 = LoadProperty2();
Property3 = LoadProperty3();//can only be done when Property1 is known
}
private static Dictionary<string, MyClass1> LoadProperty1()
{
// load data
}