C# 참조 없음 set 및 get

2762 단어 c#
처음에 저희 상대가 이랬어요.
public sealed class Emplyee
{
    public string Name;
    public int Age;
}
그리고 데이터가 파괴되지 않도록 이른바 데이터가 봉인되어 이렇게 되었다.
public sealed class Emplyee
{
    private string _name;
    private int _age;

    public string GetName()
    {
        return _name;
    }
    public void SetName(string name)
    {
        this._name = name;
    }

    public int GetAge()
    {
        return _age;
    }

    public void SetAge(int age)
    {
        this._age = age;
    }
}

이렇게 하면 나이를 설정할 때 Setage(int age)에 조건을 붙여서 불가능한 상황을 차단할 수 있다는 장점도 있다.
    public void SetAge(int age)
    {
        if(age < 0)
            throw new ArgumentOutOfRangeException("age", age.ToString(), "the age must be greater than or equal to 0");
        this._age = age;
    }

그런데 문제가 생겼어요. 직원의 자료 내용이 많고 속성이 많은데 어떡해요...
물건이 많으면 번거로움이 곧 온다
마이크로소프트가 겁내지 말라고 AIP(automatically implemented property)를 일찌감치 설계해 놓았다
class Employee
{
    private string _name;
    private int _age;

    public string Name
    {
        get { return (_name); }
        set { _name = value; }
    }

    public int Age
    {
        get { return _age; }
        set
        {
            if(value < 0)
                throw new ArgumentOutOfRangeException("age", _age.ToString(), "the age must be greater than or equal to 0");
            _age = value;
        }
    }
}
좀 편하지 않아요?
그러면 안 좋은 점을 얘기해 주세요.
1. 어떤 유형이든 AIP 하나만 있으면 이 유형의 실례를 반서열화할 수 없다
2. 디버그 시 AIP set, get 메서드에 브레이크를 추가할 수 없습니다.
몇 가지 참고 사항:
1. 속성 방법은 이상을 던질 수 있고, 필드는 영원히 던질 수 없습니다.
2. 속성은 out이나ref 매개 변수로 전달할 수 없고 필드는 이렇게 할 수 있다.
class Employee
{
    private string _name;
    private int _age;

    public string Name
    {
        get { return (_name); }
        set { }
    }
}

public class TestClass
{
    void MethodWithOutParam(out string n) { n = null; }
    public TestClass()
    {
        Employee ee = new Employee();
        MethodWithOutParam(out ee.Name);
    }
}
슬기로운 VS는 ee.Name 아래에 선홍색 물결선 그리기
3. 연속적으로 호출하면 다른 값을 되돌릴 수 있습니다. 왜냐하면 이것은 방법이기 때문입니다.
그렇게 하면 이렇게 상대를 밝힐 수 있어요.
Employee ee = new Employee() { Name = "jeff", Age = 45 };

만약 호출한 것이 본래 무참구조기였다면 이렇게 할 수도 있었다
Employee ee = new Employee { Name = "jeff", Age = 45 };

심지어 이렇게 할 수도 있어요.
var ee = new { Name = "jeff", Age = 45 };
물론 이때의 e도 Employee 실례 대상이 아니다
그리고
var people = new[]
{
    new { Name = "ghost", Year = 1945 },
    new { Name = "fuck",  Year = 1954 },
    new { Name = "damn",  Year = 1938 },
};

좋은 웹페이지 즐겨찾기