C#에서 Auto 속성 만들기

Syed Hassan Sabeeh Kazmi 2024년2월15일
  1. 클래스를 사용하여 C#에서 Auto 속성 구현
  2. Mono.Reflection 라이브러리 또는 NuGet 패키지를 사용하여 C#에서 자동 속성의 백업 필드에 값 할당
  3. C#에서 자동 속성을 수정하기 위해 클래스 개체 만들기
  4. 캡슐화를 사용하여 C#에서 읽기 전용 또는 쓰기 전용 자동 속성 만들기
C#에서 Auto 속성 만들기

항상 변수를 속성으로 리팩터링하거나 그 반대로 리팩터링할 수 있습니다. 리플렉션에 의존하고 데이터를 바인딩하려는 경우 모든 속성을 사용하는 것이 더 쉽기 때문에 사소한 속성을 만드는 데는 여러 가지 타당한 이유가 있습니다. 이 자습서에서는 자동 속성과 관련된 모든 내용과 C#에서 자동 속성을 만드는 방법을 배웁니다.

최신 C# 프로그래밍에서 자동 속성을 사용하는 것은 성능과 모범 사례를 유지하면서 코드 작성의 효율성을 유지하는 좋은 방법이자 최상의 옵션입니다.

이러한 속성은 일반적으로 메서드를 나타내지만 인터페이스에서 구현될 때 제대로 작동할 수 있습니다. 이러한 속성은 이를 구현하는 인터페이스, 클래스 또는 네임스페이스 내에서 특정 메서드의 존재를 보장하는 계약으로 수행됩니다.

클래스를 사용하여 C#에서 Auto 속성 구현

자동 속성을 초기화하는 적절한 방법은 다음과 같은 클래스를 사용하는 것입니다.

public class my_class {
  public int my_property { get; set; }
}

이렇게 하면 자동 속성이 의도를 전달하고 일관성을 보장하므로 코드를 더 읽기 쉽고 이해하기 쉬워집니다. 또한 getset 메소드 쌍을 정의하는 가장 빠른 방법입니다.

코드가 발전하고 다른 논리를 도입함에 따라 코드를 다시 컴파일할 필요가 없기 때문에 자동 속성을 정의하는 가장 좋은 방법으로 간주되는 경우가 많습니다. 또한 auto 속성은 public string new_property {get; set;} 컴파일러가 기본적으로 나머지를 생성하도록 합니다.

using System;
using System.Windows.Forms;

namespace auto_property {
  public class NetworkDevice {
    public string IP { get; set; }  // custom types | represent elements and belongs to the property
    public string drr_add { get; set; }
    public string num_serial { get; set; }
  }

  // pre-defined part of the Windows Form
  public partial class Form1 : Form {
    public Form1() {
      // initialize the design or other components created at design time
      InitializeComponent();
    }

    // represents the on-click event for the button to create the auto property
    private void button1_Click(object sender, EventArgs e) {
      NetworkDevice new_device = new NetworkDevice();
      new_device.IP = "Red_dead Search 12-D Class A";
      new_device.drr_add = "NYC, New York";
      new_device.num_serial = "S11-E2237654-C";

      MessageBox.Show(
          $"The device name: {new_device.IP} \nThe location: {new_device.drr_add} \nThe serial: {new_device.num_serial}",
          "Auto Property", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
    }
  }
}

출력:

The device name: Red_dead Search 12-D Class A
The location: NYC, New York
The serial: 511-E2237654-C

C# 자동 속성 - 클래스

C# 버전 3.0부터 개체 지향 프로그래밍 딜레마는 더 이상 존재하지 않습니다. private을 사용하여 줄을 건너뛸 수 있으며 getset 메서드에 대한 정의도 필요하지 않습니다.

결론적으로 auto 속성은 많은 프로그래머가 자신을 인식하는 데 도움이 되었으며 그 결과 유지 관리 가능한 코드가 되었습니다. 컴파일러가 각각을 완벽하게 처리하므로 필드를 수정하기 위해 getset 메소드에 대한 필드 선언을 사용하는 것이 기본 요구 사항은 아닙니다.

개인 필드를 만들거나 생성하고 매핑을 보장하는 것은 기본적으로 컴파일러의 기능입니다. 또한 auto 속성에 속하는 특정 필드를 읽고 쓸 수 있도록 getset 메서드를 채웁니다.

Mono.Reflection 라이브러리 또는 NuGet 패키지를 사용하여 C#에서 자동 속성의 백업 필드에 값 할당

자동 속성 만들기는 속성 접근자에서 추가 또는 심층 논리를 요구하지 않고 속성을 만드는 보다 구체적인 접근 방식입니다.

자동 속성의 익명 지원 필드는 속성의 getset 메서드를 사용하여 수정할 수 있습니다. 속성 선언을 사용하면 객체를 생성할 수 있는 코드를 작성할 수 있고 컴파일러가 전용 지원 필드를 생성할 수 있습니다.

일반적으로 속성은 컴파일러에 의해 생성된 지원 필드가 있는 경우 자동으로 지원 필드의 값을 반환하거나 할당해야 하는 기본 getter 및 setter를 작성하지 않아도 됩니다. 구문은 일반 속성을 만드는 것보다 훨씬 짧으며 getset 메서드가 있는 공용 클래스 및 공용 문자열이 필요합니다.

CompilerGenerated 속성은 이름이 사용자에게 표시되므로 auto 속성을 고유하게 만들지 만 컴파일러는 getset 접근자의 본문을 생성합니다. auto 속성의 지원 필드에 값을 할당할 수 있습니다. 그러나 그렇게 하는 것은 성능에 영향을 미치고 보안 및 보호를 감소시키므로 어떤 의미에서 처음부터 이러한 속성을 만드는 목적을 제거하기 때문에 권장되지 않으며 모범 사례로 간주되지 않습니다.

using System;
using System.Windows.Forms;

using Mono.Reflection;  // include after installing `Mono.Relection 2.0.0` NuGet package for your C#
                        // project

namespace auto_property {
  public class mono_exp {
    public const string name_official = "Great organization name with an excellent track record!";

    public string name_company { get; } = name_official;

    private string code_registration;

    // to assign new values to the `code_registration`
    public string pri_reg {
      get { return code_registration; }   // read
      set { code_registration = value; }  // write
    }

    // to read-only as an output
    public string name_display {
      // return the new value of `code_registration`
      get {
        return name_company + ": " + code_registration;
      }
      set {}  // empty
    }
  }
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {
      var company_name =
          typeof(mono_exp).GetProperty(nameof(mono_exp.name_company)).GetBackingField();

      var registration_no =
          typeof(mono_exp).GetProperty(nameof(mono_exp.pri_reg)).GetBackingField();

      MessageBox.Show($"{company_name.Name}, {registration_no.Name}", "Auto Property",
                      MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
    }
  }
}

출력:

<name_company>k__BackingField, code_registration

C# 자동 속성 - Mono.Reflection

몇 가지 도우미 메서드를 작성하거나, 리플렉션을 사용하여 값을 할당하거나, 개체를 단위 테스트할 때 예상되는 상태를 개체에 할당할 수 있습니다. 세터를 호출하지 않고 클래스의 예상 상태를 직접 설정하는 것이 좋습니다. 이렇게 하면 코드 테스트 또는 최적화에 중요하지 않은 일련의 이벤트가 시작될 수 있기 때문입니다.

값을 할당하기 전에 자동 속성에 대한 백업 필드를 찾는 것이 중요합니다. 한 가지 아이디어는 Jb Evain의 BackingFieldResolver를 사용하고 Mono.Reflection NuGet 패키지를 솔루션에 추가하여 이 라이브러리를 추가하는 것입니다.

지원 필드를 검색할 때마다 ArgumentException을 발생시켜 코드를 보다 효율적으로 만들고 가독성을 높입니다.

C#에서 자동 속성을 수정하기 위해 클래스 개체 만들기

자동 속성을 사용하면 애플리케이션 프로그래밍 인터페이스가 미래에 대비할 수 있고 데이터 바인딩이 가능해집니다. 자동 속성 구현의 개념은 클래스 개체를 사용하여 완전히 이해할 수 있으며 개체를 변경하면 자동 속성의 다양한 동작에 대한 이해를 높일 수 있습니다.

속성을 수정하고 액세스하기 위한 자동 속성 접근자(getset 메서드)는 C# 3.0에서 도입되었으며 이러한 속성의 기능은 C# 9.0 버전에서 init 접근자의 도입으로 더욱 향상되었습니다. 인터페이스에서 자동 속성을 선언할 수 없으므로 클래스가 될 수 있는 본문을 정의해야 하며, 자동 속성에서 함수나 특성을 호출하려면 새 클래스 개체를 만들어야 합니다.

클래스 개체는 인터페이스에서 자동 속성 요소에 액세스하는 데 도움이 되며 개발자에게 많은 가능성을 열어줍니다. 자동 속성 및 해당 요소를 초기화하는 한 가지 방법은 다음을 사용하는 것입니다.

public string {get; set;} = "example_text"

이렇게 하면 복잡한 클래스에 중요한 동작(동작에 메서드 포함) 및 데이터가 포함될 수도 있습니다.

using System;
using System.Windows.Forms;

namespace auto_property {
  public class new_element {
    public double element_ip { get; set; }
    public string element_serial { get; set; }
    public int element_drr { get; set; }

    public new_element(double IP_add, string ser_no, int counter_ddr) {
      element_ip = IP_add;
      element_serial = ser_no;
      element_drr = counter_ddr;
    }
  }
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {
      new_element element_new = new new_element(2860.01, "Red_Dead", 9743822);
      element_new.element_ip += 499.99;

      MessageBox.Show(
          $"{element_new.element_ip}, {element_new.element_serial}, {element_new.element_drr}",
          "Auto Property", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
    }
  }
}

출력:

3360, Red_Dead, 9743822

C# 자동 속성 - 클래스 객체

속성 접근자에 추가 논리가 필요하지 않은 경우 자동 속성이 사용되고 public int some_property {get; set;}. 자동 속성을 사용하면 필드를 공개로 노출하지 않고 항상 속성을 통해 모든 항목에 액세스하는 것과 같은 디자인 철학으로 간결하고 구체적인 것을 만들 수 있습니다.

C# 3.0 이상 버전에서는 클라이언트 코드에서 개체를 만들고 수정할 수 있으므로 보다 간결한 속성 선언과 고성능 자동 속성 생성이 가능합니다. Visual Studio에서 개발하면 속성 호출자와의 계약을 위반하지 않고 수정하고 명확하지 않은 변경 소스로 인해 리플렉션을 사용하여 변경할 수 있으므로 getset에 대한 중단점을 허용합니다.

캡슐화를 사용하여 C#에서 읽기 전용 또는 쓰기 전용 자동 속성 만들기

암호화를 사용하면 자동 속성을 쉽게 처리하고 수정할 수 있지만 여전히 클래스 내에서 변경할 수 있으며 리플렉션을 통해 개인 setter에 계속 액세스할 수 있으므로 변경할 수 없습니다. C# 6.0 이상부터 진정한 읽기 전용쓰기 전용 자동 속성을 만들 수 있습니다.

읽기 전용 자동 속성은 생성자 외부에서 변경할 수 없는 변경 불가능한 속성일 수 있습니다.

public string new_property { get; }
public new_class() {
  this.new_property = "something";
}

나중에 컴파일 시간에 이 불변(읽기 전용) 속성은 다음과 같이 됩니다.

readonly string new_name;
public string new_property {
  get { return this.new_name; }
}
public new_class() {
  this.new_name = "something";
}

결과적으로 이렇게 하면 코드를 최적화하고 초과 코드를 종료하여 많은 시간을 절약할 수 있습니다. 필드/변수를 비공개로 선언하고 공개 getset 메서드를 제공하여 비공개 필드의 값에 액세스하고 업데이트함으로써 성공적인 자동 속성을 달성하려면 캡슐화에 대한 기본적인 이해가 있어야 합니다.

향상된 보안 및 향상된 유연성 외에도 자동 속성을 사용하면 속성을 읽기 전용(get 메서드만 사용) 또는 쓰기 전용(set 메서드만 사용)으로 만들 수 있습니다.

자동 속성에 직접 값을 할당하는 것은 깨끗하고 아름다워 보입니다. 여전히 그것은 환상이며 릴리스 모드에서 코드를 빌드하고 프로그램 디버그 데이터베이스를 제거하고 디컴파일러로 결과 라이브러리를 연 후에 차이를 볼 수 있습니다.

using System;
using System.Windows.Forms;

namespace auto_property {
  public class new_element {
    /*

    // write only auto property example

    private int _int;
    public int _newint
    {
        set { _int = value; }
    }

     */
    public double element_ip { get; set; }
    public string element_serial { get; }  // read-only
    public int element_drr { get; }        // read-only

    public new_element(double IP_add, string ser_no, int counter_ddr) {
      element_ip = IP_add;
      element_serial = ser_no;
      element_drr = counter_ddr;
    }
  }
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {
      new_element element_new = new new_element(2860.01, "Red_Dead", 9743822);
      element_new.element_ip += 499.99;  // modification

      MessageBox.Show(
          $"{element_new.element_ip}, {element_new.element_serial}, {element_new.element_drr}",
          "Auto Property", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
    }
  }
}

출력:

3360, Red_Dead, 9743822

C# 자동 속성 - 캡슐화

변수와 속성 사이에 마찰이 너무 많기 때문에 Kevin Dente는 public property int example_var;라는 새로운 구문을 도입했습니다. 속성은 변수와 동일한 작업을 수행하지만 가시성을 보다 세밀하게 제어할 수 있기 때문입니다. auto 속성은 가벼워야 하며 상당한 노력이 필요한 경우 명시적 메서드로 리팩터링할 수 있습니다.

auto 속성은 일반 속성보다 더 효과적이며 일반 속성과 동일한 최적화를 받기 때문에 반패턴이 아닙니다. 유일한 차이점은 지원 필드가 자동으로 생성된다는 점입니다. 이 자습서에서는 C#에서 auto 속성을 정의, 최적화 및 수정하는 방법을 설명했습니다.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub

관련 문장 - Csharp Property