C#在类中重新定义变量

时间:2016-11-27 19:07:28

标签: c# types casting redefine

我确定问题"类型"在C#。

假设我有一个具有工作名称的课程" item"。  这个类有一个字段,如"变量"。 该字段应与我的程序中的元素匹配,例如Boolean int16,int32,int64,double,uint,uint16。

是否有可能在依赖需求中重新定义变量的类型? 或者还有其他方法可以解决这个问题吗?

我认为这个变量的定义是var或object,然后将它投影到给定的类型上。

问题是分配值后的检查时间是否超出范围?

2 个答案:

答案 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