gpt4 book ai didi

c# - 让方法在 c# 中采用任何数据类型

转载 作者:IT王子 更新时间:2023-10-29 04:20:25 27 4
gpt4 key购买 nike

我有很多单元测试几乎都在测试相同的行为。但是,数据类型会发生变化。

我正在尝试创建一个可以采用任何数据类型的通用方法。我尝试将我的输入参数设置为 var,但这是不允许的。此外,研究了 c# 泛型,但它通常处理列表。

最佳答案

您可以将参数设置为 object :

public void DoSomething(object arg)
{
//...

或者你可以做我喜欢的事情并制作一个通用方法:

public void DoSomething<T>(T arg)
{
//...

通用方法有两个主要优点,我将举例说明它们为何有用:

  1. 即使您没有明确指定 arg 的类型,您仍然可以访问它。
  2. 您可以对要允许的类型添加约束。

相反,object方法有一些重要的缺点:

  1. 既然你正在治疗 arg作为object ,你将只能做你可以用任何对象做的事情。
  2. 如果您将值类型作为 object 传递参数,变量将为 boxed ,这意味着性能下降。这不是一个巨大的打击,但如果你调用DoSomething连续数千次,您可能会开始感觉到。

泛型和类型约束

向泛型方法添加类型约束允许您限制该方法,使其仅接受特定类型。为什么这有用?因为即使您不知道(或不关心)您正在使用哪种特定类型,您现在对它有所了解,并且可以使用该信息。

考虑以下设置:

public interface IAnimal 
{
void Move();
}
public class Duck : IAnimal
{
public void Move()
{
Console.WriteLine("Flying");
}
}
public class Fish : IAnimal
{
public void Move()
{
Console.WriteLine("Swimming");
}
}
public class Ant : IAnimal
{
public void Move()
{
Console.WriteLine("Walking");
}
}

因为我们有一个 IAnimal接口(interface),我们可以编写针对 IAnimal任何实现的通用方法:

public class Program
{
static void DoMove<T>(T animal) where T : IAnimal
{
animal.Move();
}
public static void Main(string[] args)
{
Duck duck = new Duck();
Fish fish = new Fish();
Ant ant = new Ant();

DoMove<Duck>(duck);
DoMove<Fish>(fish);
DoMove<Ant>(ant);
}
}

运行它:http://rextester.com/GOF1761

当我们写 DoMove方法,我们不关心它的参数是否为 animalDuck , 一个 Fish , 一个 Ant ,或其他任何东西。我们只关心打电话 animal.Move() .由于我们使用了 where T : IAnimal约束,编译器知道我们需要它知道的一切:

  1. 变量animal类型为 T .
  2. 随便T是,它实现了 IAnimal .
  3. 任何实现 IAnimal 的东西有一个 Move()方法。
  4. 因此,我们可以安全地调用animal.Move() .

(顺便说一句,是的,我们可以将 DoMove 写成 static void DoMove(IAnimal animal) ,但那是另一个讨论。)

类型推断(及其一些含义)

好吧,但让我们更进一步。在许多情况下,您可以调用泛型方法而无需指定它们的类型参数。这叫做 type inference , 除了节省您的输入时间外,它在对不同类型的对象执行相同操作时也很有用。

public static void Main(string[] args)
{
IAnimal[] animals = new IAnimal[]
{
new Duck(),
new Fish(),
new Ant()
};

foreach (IAnimal animal in animals)
{
DoMove(animal);
}
}

运行它:http://rextester.com/OVKIA12317

你只需要写DoMove<T>方法一次,您可以在任何类型的 IAnimal 上调用它而不必给出更具体的类型。每次都会调用适当版本的 Move,因为 DoMove<T>能够推断出哪种类型用于 T .当您调用 DoMove(duck) , .NET 理解你真正的意思 DoMove<Duck>(duck) ,然后调用 Move Duck 上的方法类。

关于c# - 让方法在 c# 中采用任何数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5886875/

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