2016년 11월 24일 목요일

struct vs class in C#

https://msdn.microsoft.com/ko-kr/library/ms173109.aspx

struct

: https://msdn.microsoft.com/ko-kr/library/0taef578.aspx

- argument가 없는 default constructor, destructor 생성 불가
 : argument가 있는 constructor는 생성 가능
- struct는 value type이므로 복사 시 동일한 데이터의 별도 복사본시 생성됨.
 : new 연산자를 사용하지 않고 인스턴스화 할 수 있음.
- 상속 지원하지 않으나 인터페이스를 구현할 수 있음.


 public struct CoOrds
    {
        public int x, y;

        public CoOrds(int p1, int p2)
        {
            x = p1;
            y = p2;
        }
    }

    // Declare and initialize struct objects.
    class TestCoOrds
    {
        static void Main()
        {
            // Initialize:   
            CoOrds coords1 = new CoOrds();
            CoOrds coords2 = new CoOrds(10, 10);

            // Display results:
            Console.Write("CoOrds 1: ");
            Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);

            Console.Write("CoOrds 2: ");
            Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y);

            // Keep the console window open in debug mode.
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
    /* Output:
        CoOrds 1: x = 0, y = 0
        CoOrds 2: x = 10, y = 10
    */
    // Declare a struct object without "new."
    class TestCoOrdsNoNew
    {
        static void Main()
        {
            // Declare an object:
            CoOrds coords1;

            // Initialize:
            coords1.x = 10;
            coords1.y = 20;

            // Display results:
            Console.Write("CoOrds 1: ");
            Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);

            // Keep the console window open in debug mode.
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
    // Output: CoOrds 1: x = 10, y = 20

class

: https://msdn.microsoft.com/ko-kr/library/x9afc042.aspx

- 클래스는 reference type, 복사본은 원 변수의 개체를 참조함.
- 상속 제한을 위해서는 sealed 사용.
- 파생 클래스는 기본 클래스의 virtual, abstract 선언 멤버함수를 재정의 가능
- 파생 멤버는 override를 명시적으로 사용
- 같은 이름이지만 상속 관계가 아닐 경우 new 사용

    public class Person
    {
        // Field
        public string name;

        // Constructor that takes no arguments.
        public Person()
        {
            name = "unknown";
        }

        // Constructor that takes one argument.
        public Person(string nm)
        {
            name = nm;
        }

        // Method
        public void SetName(string newName)
        {
            name = newName;
        }
    }
    class TestPerson
    {
        static void Main()
        {
            // Call the constructor that has no parameters.
            Person person1 = new Person();
            Console.WriteLine(person1.name);

            person1.SetName("John Smith");
            Console.WriteLine(person1.name);

            // Call the constructor that has one parameter.
            Person person2 = new Person("Sarah Jones");
            Console.WriteLine(person2.name);

            // Keep the console window open in debug mode.
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
    // Output:
    // unknown
    // John Smith
    // Sarah Jones



댓글 없음:

댓글 쓰기