我确定问题"类型"在C#。
假设我有一个具有工作名称的课程" item"。 这个类有一个字段,如"变量"。 该字段应与我的程序中的元素匹配,例如Boolean int16,int32,int64,double,uint,uint16。
是否有可能在依赖需求中重新定义变量的类型? 或者还有其他方法可以解决这个问题吗?
我认为这个变量的定义是var或object,然后将它投影到给定的类型上。
问题是分配值后的检查时间是否超出范围?
答案 0 :(得分:0)
您可以使用泛型。当您使用新类型创建对象时,它将自动在代码后面创建一个类定义。
E/AndroidRuntime: FATAL EXCEPTION: main Process:com.example.ofir.bopofinal, PID: 3038
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
at android.support.v7.app.AppCompatDelegateImplV9.createSubDecor(AppCompatDelegateImplV9.java:351)
at android.support.v7.app.AppCompatDelegateImplV9.ensureSubDecor(AppCompatDelegateImplV9.java:320)
at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:281)
at android.support.v7.app.AppCompatDialog.setContentView(AppCompatDialog.java:83)
at android.support.v7.app.AlertController.installContent(AlertController.java:214)
at android.support.v7.app.AlertDialog.onCreate(AlertDialog.java:258)
at android.app.Dialog.dispatchOnCreate(Dialog.java:394)
at android.app.Dialog.show(Dialog.java:295)
at com.example.ofir.bopofinal.LoginRegister.LoginActivity.alertDialog(LoginActivity.java:53)
at com.example.ofir.bopofinal.LoginRegister.RegisterActivity$3.onPostExecute(RegisterActivity.java:162)
at com.example.ofir.bopofinal.LoginRegister.RegisterActivity$3.onPostExecute(RegisterActivity.java:153)
at android.os.AsyncTask.finish(AsyncTask.java:651)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
然后你可以使用不同类型的
public class GenericClass<T>
{
public T MyProperty { get; set; }
public void TestMethod()
{
Console.WriteLine(MyProperty.ToString());
}
}
您还可以放置约束,以便泛型类必须实现特定的接口,类,具有构造函数。 公共接口IPrintable { void Print(); }
var myIntClass = new GenericClass<int>();
var myStringClass = new GenericClass<string>();
myIntClass.MyProperty = 1;
myStringClass.MyProperty = "test";
myIntClass.TestMethod();
myStringClass.TestMethod();
您还可以查看新关键字动态。它允许您在运行时处理对象
答案 1 :(得分:0)
您可以使用泛型或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