C# 在 class 中重新定义一个变量
C# redefine a variable in class
我确定 C# 中的问题 "types"。
假设我有一个 class,工作名称是 "item"。
这个class有一个字段比如"variable"。
该字段应与我程序中元素的字段相匹配,例如布尔值 int16、int32、int64、double、uint、uint16。
是否有可能重新定义依赖项中的变量类型?
或者有没有其他方法可以解决这个问题?
我考虑将此变量定义为 var 或 object,然后将其投影到给定类型。
问题是后面赋值的时候检查没有超出范围?
您可以使用泛型。当您创建具有新类型的对象时,它会自动在代码后面创建一个 class 定义。
public class GenericClass<T>
{
public T MyProperty { get; set; }
public void TestMethod()
{
Console.WriteLine(MyProperty.ToString());
}
}
然后你可以用不同的类型
var myIntClass = new GenericClass<int>();
var myStringClass = new GenericClass<string>();
myIntClass.MyProperty = 1;
myStringClass.MyProperty = "test";
myIntClass.TestMethod();
myStringClass.TestMethod();
您还可以设置约束,使泛型 class 必须实现特定接口,即 class,具有构造函数。
public 接口IPrintable
{
无效打印();
}
public class GenericClassWithConstraint<T> where T : IPrintable
{
public T MyProperty { get; set; }
void Print()
{
MyProperty.Print();
}
}
您还可以查看新关键字 dynamic。它将允许您在运行时处理对象
您可以使用泛型,也可以使用 dynamic
,具体取决于您希望如何使用 Item
。
要使用泛型方法,请这样定义 Item
:
class Item<T> {
public T Variable { get; set; }
}
当你想要一个 Variable
是 int 的项目时,这样做:
var intItem = new Item<int>()
// you can set the Variable property to an int now!
intItem.Variable = -1;
当您想要 Variable
是一个字节的项目时,请执行以下操作:
var byteItem = new Item<byte>()
// you can set the Variable property to a byte
byteItem.Variable = 10;
以此类推...
此方法的一个特点是项目的 Variable
类型一旦创建就无法更改。所以这是不可能的:
intItem.Variable = "Hello";
如果您想在不创建新项目的情况下将其类型更改为其他类型,您应该使用动态变量:
class Item {
public dynamic Variable {get; set;}
}
您现在可以这样做:
var myItem = new Item();
myItem.Variable = "Hello";
myItem.Variable = 10;
这与将 Variable
定义为 object
基本相同,但它可以节省您在 object
和所需类型之间转换的时间。
关于您担心检查值是否超出范围,如果您使用 dynamic
可能会有点难以检查。但是我做了这个小测试,发现当值溢出时,它会绕回:
var item = new Item();
item.Variable = byte.MaxValue;
item.Variable++;
Console.WriteLine(item.Variable); // prints 0
我确定 C# 中的问题 "types"。
假设我有一个 class,工作名称是 "item"。 这个class有一个字段比如"variable"。 该字段应与我程序中元素的字段相匹配,例如布尔值 int16、int32、int64、double、uint、uint16。
是否有可能重新定义依赖项中的变量类型? 或者有没有其他方法可以解决这个问题?
我考虑将此变量定义为 var 或 object,然后将其投影到给定类型。
问题是后面赋值的时候检查没有超出范围?
您可以使用泛型。当您创建具有新类型的对象时,它会自动在代码后面创建一个 class 定义。
public class GenericClass<T>
{
public T MyProperty { get; set; }
public void TestMethod()
{
Console.WriteLine(MyProperty.ToString());
}
}
然后你可以用不同的类型
var myIntClass = new GenericClass<int>();
var myStringClass = new GenericClass<string>();
myIntClass.MyProperty = 1;
myStringClass.MyProperty = "test";
myIntClass.TestMethod();
myStringClass.TestMethod();
您还可以设置约束,使泛型 class 必须实现特定接口,即 class,具有构造函数。 public 接口IPrintable { 无效打印(); }
public class GenericClassWithConstraint<T> where T : IPrintable
{
public T MyProperty { get; set; }
void Print()
{
MyProperty.Print();
}
}
您还可以查看新关键字 dynamic。它将允许您在运行时处理对象
您可以使用泛型,也可以使用 dynamic
,具体取决于您希望如何使用 Item
。
要使用泛型方法,请这样定义 Item
:
class Item<T> {
public T Variable { get; set; }
}
当你想要一个 Variable
是 int 的项目时,这样做:
var intItem = new Item<int>()
// you can set the Variable property to an int now!
intItem.Variable = -1;
当您想要 Variable
是一个字节的项目时,请执行以下操作:
var byteItem = new Item<byte>()
// you can set the Variable property to a byte
byteItem.Variable = 10;
以此类推...
此方法的一个特点是项目的 Variable
类型一旦创建就无法更改。所以这是不可能的:
intItem.Variable = "Hello";
如果您想在不创建新项目的情况下将其类型更改为其他类型,您应该使用动态变量:
class Item {
public dynamic Variable {get; set;}
}
您现在可以这样做:
var myItem = new Item();
myItem.Variable = "Hello";
myItem.Variable = 10;
这与将 Variable
定义为 object
基本相同,但它可以节省您在 object
和所需类型之间转换的时间。
关于您担心检查值是否超出范围,如果您使用 dynamic
可能会有点难以检查。但是我做了这个小测试,发现当值溢出时,它会绕回:
var item = new Item();
item.Variable = byte.MaxValue;
item.Variable++;
Console.WriteLine(item.Variable); // prints 0