c# - 定义泛型时 new() 的目的是什么?

标签 c#

我正在尝试理解泛型。这是一个示例:

   public static bool CreateTableIfNotExist<T>(this CloudTableClient tableStorage, string entityName)
        where T : TableServiceEntity, new()
    {
        bool result = tableStorage.CreateTableIfNotExist(entityName);

        return result;
    }

我有几个问题。首先,定义中 new() 的目的是什么。我的另一个问题是,我该如何使用这个泛型。这里有一个例子:

_tableStorage.CreateTableIfNotExist<MembershipRow>(_tableName);

但是我不明白。这个泛型的真正目的是什么?如果没有泛型,我不能做同样的事情吗?

_tableStorage.CreateTableIfNotExist("MyNewTable");

最佳答案

它是一个泛型类型约束,声明该类型必须具有公共(public)无参数构造函数。

myCloudTableClient.CreateTableIfNotExist<TypeWithPublicParameterlessConstructor>("Customers");

Further reading .

这个的主要用途是允许通用代码构造 T 的实例,而不是 default(T) -你可能经常看到的东西。不幸的是,当涉及到对构造函数的约束时,除了公共(public)无参数构造函数之外,没有任何约束支持。

更新:查看您更新的代码,从未使用过泛型,因此在这种情况下它没有任何用处。泛型在扩展方法上的一个常见策略是支持泛型扩展方法。

public static bool Equals<T>(this T self, T other) where T : IEquatable<T>
{
    return self.Equals(other);
}

更新 2:在您指定类型约束的示例中,这仅在类型约束 could be inferred 时有效由编译器根据使用情况...我不确定你的情况会发生什么,但我猜它不会编译。

关于c# - 定义泛型时 new() 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8517693/

相关文章:

c# - 显示/隐藏 PictureBox 内的按钮

C# 为什么必须将转换运算符声明为静态和公共(public)的?

c# - 问题是在 Windows 7 中为 UBL Api 安装 .pem 扩展安全证书

java - 如何对整数除法的结果进行四舍五入?

c# - 如何从 BackgroundWorker 线程中更新标签?

c# - 自动完成案例问题

c# - 隔离级别问题。即使设置为 ReadUncommited 也无法访问表

c# - 如何在 C# 中将值从 X 类复制到具有相同属性名称的 Y 类?

c# - 有没有办法在最小化进程时也从进程中获取屏幕截图?

java - 是否有一种语言支持变量声明时的隐式复合类型?