C# 对象初始化问题(可否像C语言的结构一样,简洁的初始化)

C# 语言的结构、对象,可否像C语言的结构一样,简洁的初始化?一般是不可以的。经过一系列复杂的“加工”,C#对象是可以的。

C语言的结构,可以用简洁的方式初始化,

例如 struct a = { 1 , "abc"};

C#  语言的对象,是否也可以使用类似的方式呢?

例如:Class_a_b myClass_ab = new Class_a_b { 1, "2" };

收集网络上的各种信息,杂凑出了如下的代码:(当然,使用自定义的构造函数,用括号而不是花括号的方法,很容易就实现“简易”初始化)

  

sing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;


namespace ConsoleApplication2
{
    class Class_a_b : IEnumerable //只能用 class 不能用 struct ,不知道为什么
    {
        public int field_int;
        public string field_string; //在这个类中,就这两个域是“有用”的数据
        //下面的语句都是为了“简单初始化”而服务的
        // 最终就是为了实现: Class_a_b myClass_ab = new Class_a_b { 1, "2" };


        int current = 0;  //如果不是class,而是 struct 结构,这句会初始化赋值语句,会出错
        public IEnumerator GetEnumerator()
        {
            return new TokenEnumerator(this);
        }
        public void Add(object aa)
        {
            if (current++ == 0)
                field_int = (int)aa;
            else
                field_string = (string)aa;
        }
        private class TokenEnumerator : IEnumerator
        {
            private int position = -1;
            private Class_a_b t;


            public TokenEnumerator(Class_a_b t)
            {
                this.t = t;
            }


            // Declare the MoveNext method required by IEnumerator:
            public bool MoveNext()
            {
                if (position < 1)
                {
                    position++;
                    return true;
                }
                else
                {
                    return false;
                }
            }


            // Declare the Reset method required by IEnumerator:
            public void Reset()
            {
                position = -1;
            }


            // Declare the Current property required by IEnumerator:
            public object Current
            {
                get
                {
                    if (position == 0) return t.field_int;
                    else return t.field_string;
                }
            }
        }
    }

//测试一下
    class Program
    {
        static void Main(string[] args)
        {//终于实现了如下的语句:
            Class_a_b myClass_ab = new Class_a_b { 1, "2" }; //这个就是传说中的“简单初始化”,是不是“相当的简单啊!”
            int AA = myClass_ab.field_int; //在这里设置断点,检查结果
            string bb = myClass_ab.field_string;


        }
    }
}


再补充一个struct List的例子,使用花括号初始化自定义的Class类型:代码来自网络


    public struct MyUI //这是要初始化的结构
    {
        string A;
        string B;
        int C;

        public MyUI(string a, string b, int c)
        {
            A = a;
            B = b;
            C = c;
        }
    }


    public class MyList : IEnumerable<MyUI>  // note: using System.Collections;
    {
        private List<MyUI> lst = new List<MyUI>(); //这个是关键,创建了一个List

        public void Add(string a, string b, int c)
        {
            lst.Add(new MyUI(a, b, c));
        }

        public IEnumerator<MyUI> GetEnumerator()
        {
            return lst.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return lst.GetEnumerator();
        }
    }


    //这里,关键是要实现 IEnumerable,同时有一个 Add 方法用于匹配 { ....} 表达式。
    //最终可以这样调用其实例化和Add方法。测试一下:
    public class Test
    {
        MyList m_pList = new MyList
        {
            {"asd", "234", 2},
            {"k2j", "298", 3}
        };
        //MyUI struct_test = new MyUI { "k2j", "298", 3 }; //error!!!
    }


posted on 2017-10-26 13:16  johnphan  阅读(167)  评论(0编辑  收藏  举报

导航