如何将 "alias" 赋予数据类型以便稍后更改它

How to give an "alias" to a data type to later change it

首先举个例子,但请三思而后行,不要讨论我应该使用一种类型还是另一种类型,重点在于改变数据类型的可能性:

假设我们正在创建一个处理金钱和人口的应用程序。我们决定 用 Uint16 类型表示货币数量,因为先验似乎合理,大小就足够了,我们不会使用负值。

一段时间后,我们意识到我们将需要不同的类型,因为我们现在需要负值,或者比可能的更多的数量由 Uint16 表示,因此我们希望使用 Int32 代替货币计算。但是我们的代码中还有Uint16表示的其他量(比如人口),所以我们不能直接把所有使用Uint16的都换成Int32。

所以问题是:如何在特定情况下引用数据类型,以便我能够轻松更改正在使用的数据类型,而不影响相同数据类型的不相关使用?

请注意,我在考虑这个问题时并没有创造 class 金钱,但如果你认为这是应该的方式,我也很乐意阅读你的推理。

给类型起别名的一种方法是在 using 部分中进行。您可以为任何类型指定一个自定义名称,然后在您的代码中使用该名称。

如果您只是想从 uint 切换到 decimal,您可以使用内置类型执行此操作:

using Number = System.Int32;

你会像这样使用它:

Number myNumber = 1;

然后,如果您想将 Number 的所有实例更改为 decimal,只需执行以下操作:

using Number = System.Decimal;

您也可以使用自定义类型执行此操作,例如,假设我们有两个 类、Bank1Bank2Bank1 有一个名为 Balanceuint 属性,而 Bank2 有一个同名的 decimal 属性。我们可以创建一个我们在代码中使用的名为 Bank 的别名,并让它引用类型 Bank1,然后我们可以实例化它的一个实例并将 int 分配给余额.

为了突出显示每次都调用不同的 类,我更改了它们的 ToString 覆盖,以便 decimal 余额显示有小数点:

using Bank = Test.Bank1;

namespace Test
{
    public class Bank1
    {
        public uint Balance { get; set; }
        public override string ToString() => $"Balance is {Balance}";
    }

    public class Bank2
    {
        public decimal Balance { get; set; }
        public override string ToString() => $"Balance is {Balance:N2}";
    }

    public class Program
    {
        private static void Main(string[] args)
        {
            var bank = new Bank();
            bank.Balance = 100;

            Console.WriteLine(bank);

            GetKeyFromUser("\nDone! Press any key to exit...");
        }
    }
}

现在,稍后我们可以在不破坏代码的情况下更改别名所指的内容:

using Bank = Test.Bank2;  // Just change what the alias refers to here    

请注意,您仍然需要修复更改类型后可能出现的任何编译错误,具体取决于您所做的更改。