gpt4 book ai didi

c# - 链重载构造函数?

转载 作者:行者123 更新时间:2023-11-30 13:18:20 25 4
gpt4 key购买 nike

我正在尝试构建一个类,该类将通过传入对数据库中记录的引用来初始化自身(目的是对数据库运行查询,并且对象属性的返回值将在其中设置),或通过“手动”指定值 - 这不需要数据库调用。

我查阅了几本教科书来发现此功能的“最佳实践”,遗憾的是我没有找到。

我已经编写了几个示例控制台应用程序,反射(reflect)了我认为最可能的两个解决方案,但我不知道哪个是最好的正确实现?

示例应用程序 #1 使用大多数书籍告诉我的“首选”方式,但与这些声明一起给出的大多数示例并不真正适合我的情况。我在这里担心流程不如应用程序 #2 可读。

using System;

namespace TestApp
{
public class Program
{
public static void Main(string[] args)
{
var one = new OverloadedClassTester();
var two = new OverloadedClassTester(42);
var three = new OverloadedClassTester(69, "Mike", 24);

Console.WriteLine("{0}{1}{2}", one, two, three);

Console.ReadKey();
}
}

public class OverloadedClassTester
{
public int ID { get; set; }
public string Name { get; set; }
public int age { get; set; }

public OverloadedClassTester() : this(0) { }

public OverloadedClassTester (int _ID) : this (_ID, "", 0)
{
this.age = 14; // Pretend that this was sourced from a database
this.Name = "Steve"; // Pretend that this was sourced from a database
}

public OverloadedClassTester(int _ID, string _Name, int _age)
{
this.ID = _ID;
this.Name = _Name;
this.age = _age;
}

public override string ToString()
{
return String.Format("ID: {0}\nName: {1}\nAge: {2}\n\n", this.ID, this.Name, this.age);
}
}
}

此示例(App #2)“看起来”更具可读性 - 因为我认为更容易看到操作流程。但是,就保存的字符而言,它确实看起来很有效:p。此外,它在完全初始化之前调用对象的方法是否不危险,或者这不是一个问题?

using System;

namespace TestApp
{
public class Program
{
public static void Main(string[] args)
{
var one = new OverloadedClassTester();
var two = new OverloadedClassTester(42);
var three = new OverloadedClassTester(69, "Mike", 24);

Console.WriteLine("{0}{1}{2}", one, two, three);

Console.ReadKey();
}
}

public class OverloadedClassTester
{
public int ID { get; set; }
public string Name { get; set; }
public int age { get; set; }

public OverloadedClassTester()
{
initialise(0, "", 21); // use defaults.
}

public OverloadedClassTester (int _ID)
{
var age = 14; // Pretend that this was sourced from a database (from _ID)
var Name = "Steve"; // Pretend that this was sourced from a database (from _ID)

initialise(_ID, Name, age);
}

public OverloadedClassTester(int _ID, string _Name, int _age)
{
initialise(_ID, _Name, _age);
}

public void initialise(int _ID, string _Name, int _age)
{
this.ID = _ID;
this.Name = _Name;
this.age = _age;
}

public override string ToString()
{
return String.Format("ID: {0}\nName: {1}\nAge: {2}\n\n", this.ID, this.Name, this.age);
}
}
}

解决这个问题的“正确”方法是什么,为什么?

谢谢,

最佳答案

我肯定会链接构造函数,这样只有一个可以完成“真正的工作”。这意味着您只需要在一个地方真正的工作,所以如果工作发生变化(例如,您需要在构造函数的末尾调用一些验证方法),您只有一个地方需要更改代码。

使“简单”重载调用具有更多参数的重载是一种非常常见的 IME 模式。我发现它比第二个版本更具可读性,因为您可以很容易地看出调用一个重载与使用默认值调用“更大”的重载是一样的。对于第二个版本,您必须比较构造函数的主体。

我尽量不使用多个直接链接到基类的构造函数——当然,除非它链接到不同的基类构造函数(这是典型的异常(exception)情况)。

关于c# - 链重载构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1520016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com