{get; 세트; } C #의 구문?


577

ASP.NET MVC를 배우고 있으며 영어 문서를 읽을 수 있지만이 코드에서 무슨 일이 일어나고 있는지 이해하지 못합니다.

public class Genre
{
    public string Name { get; set; }
}

이것은 무엇을 의미 { get; set; }합니까?


4
일반적으로 setter를 사용하면 객체를 변경 가능하게 만들 수 있습니다. getters는 "대상에게해야 할 일을 말하고 정보를 요구하지 말고 직접 조작하십시오"를 위반합니다. 따라서 일반적으로 기본적으로 setter 및 getter를 추가하지 마십시오. 종종 필요하지만 추가하기 전에 항상 실제 필요를 찾아야합니다. 특히 setter는 프로덕션 코드에서 거의 사용해서는 안됩니다 (가능한 경우 불변성을 위해 노력하고, 돌연변이가 필요한 경우에는 값을 설정하지 말고 변경하도록 요청해야합니다).
Bill K

8
그냥 추가하기 만하면 ... 입력하지 않으면 Field를{get; set;} 작성 하지만 입력하면 Property를 작성하는 것 입니다. 속성을 가지고 있으면 리플렉션 작업을 할 때 특히 쉬울 수 있습니다. {get; set;}
세이치

get-setter를 사용하는 @Seichi는 Field도 생성하지만이 필드는 숨겨지고 비공개로 선언되어 자동 생성 된 속성에 의해 수정됩니다. 컴파일러가 만든 모든 것.
Jonathan Ramos

1
자동 속성은 개인 필드 의 목적을 무효화하지 않습니까?
mireazma

답변:


567

소위 자동 속성이며 본질적으로 다음과 같은 약어입니다 (컴파일러에서 유사한 코드가 생성됨).

private string name;
public string Name
{
    get
    {
        return this.name;
    }
    set
    {
        this.name = value;
    }
}

93
클라우스,이 코드로 어떤 일이 일어날 지 설명해 주시겠습니까? 보다 철저한 설명이 도움이 될 수 있습니다.
TylerH

3
그래서, 확실히하기 위해 : =연산자에 과부하가 걸리는 것과 같지만 특정 요소 하나에 만 해당됩니다.
Hi-Angel

9
왜 우리는 private var가 필요합니까? :-/ 수치심.
Oliver Dixon

2
@TylerH 개인 변수의 이유는 캡슐화이므로 get / set은 변수를 가져 오거나 설정하기위한 "게이트"를 제공합니다. "게이트"가 개인 변수의 캡슐화를 깨뜨릴 수 있기 때문에 get / setter를 사용하지 않는 데는 여러 가지 이유가 있습니다. (액세스 할 수 없어야 함)
Alexander

4
분명하지만, 속기는 문자 그대로 의 속기가 아님을 분명히하고 싶습니다 . 즉, 개인 변수 name가 작성 되지 않습니다 . 클래스 내에서이 개인 변수를 참조하려고하면 실패합니다. C #이 어떻게 작동하는지 잘 모르겠지만 이름이없는 개인 변수가있는 것처럼 작동합니다.이 변수는 코드에서 액세스 할 수 없습니다.
Denziloe

432

{ get; set; }다시피 @Klaus와 @Brandon이 말한 것처럼 "자동 속성"은 "백킹 필드"가있는 속성을 작성하는 데 사용되는 약어입니다. 따라서이 경우 :

public class Genre
{
    private string name; // This is the backing field
    public string Name   // This is your property
    {
        get => name;
        set => name = value;
    }
}

그러나 한 시간 정도 전에 나와 같은 사람이라면 속성접근 자가 무엇인지 실제로 이해 하지 못하며 기본 용어를 가장 잘 이해하지 못합니다. MSDN은 이와 같은 학습을위한 훌륭한 도구이지만 초보자에게는 항상 이해하기 쉽지 않습니다. 그래서 여기서 더 깊이 설명하려고합니다.

get하고 set있는 접근은 에서 데이터에 액세스하고 정보를 그들에게있는 거 수를 의미하는 개인 (보통의 필드 백업 필드 ) 보통에서 그렇게 대중 특성 (위의 예에서 볼 수 있듯이).

위의 진술이 매우 혼란 스럽다는 것을 부인할 수는 없습니다. 이 코드가 음악 장르를 의미한다고 가정 해 봅시다. 그래서 장르 수업 내에서 우리는 다른 장르의 음악을 원할 것입니다. 힙합, 록 및 컨트리의 3 가지 장르를 원한다고 가정 해 봅시다. 이를 위해 클래스 이름을 사용하여 해당 클래스의 새 인스턴스 를 만듭니다 .

Genre g1 = new Genre(); //Here we're creating a new instance of the class "Genre"
                        //called g1. We'll create as many as we need (3)
Genre g2 = new Genre();
Genre g3 = new Genre();

//Note the () following new Genre. I believe that's essential since we're creating a
//new instance of a class (Like I said, I'm a beginner so I can't tell you exactly why
//it's there but I do know it's essential)

Genre 클래스의 인스턴스를 만들었으므로 위에서 설정 한 'Name' 속성 을 사용하여 장르 이름을 설정할 수 있습니다 .

public string Name //Again, this is the 'Name' property
{ get; set; } //And this is the shorthand version the process we're doing right now 

다음을 작성하여 'g1'이라는 이름을 힙합으로 설정할 수 있습니다

g1.Name = "Hip Hop";

여기서 일어나는 일은 복잡한 것입니다. 마찬가지로 내가 전에 말했듯이, get그리고 set당신이 그렇지 않으면 액세스 할 수 없습니다 것을 민간 분야의 정보에 액세스. 개인 필드 get에서만 정보를 읽고 반환 할 수 있습니다. 해당 개인 필드 set에만 정보를 수 있습니다 . 그러나 모두 속성을함으로써 get그리고 set우리가 할 수있어 이러한 기능을 모두 수행합니다. 그리고 g1.Name = "Hip Hop";우리는 구체적으로 setName 속성 의 함수를 사용합니다

set라는 암시 적 변수를 사용합니다 value. 기본적으로 이것이 의미하는 것은 안에 "value"가 표시 될 때마다 set변수를 참조하는 것입니다. "value"변수 우리가 쓸 때이 경우 변수 를 전달 g1.Name =하기 =위해를 사용하고 있습니다. 따라서 본질적으로 다음과 같이 생각할 수 있습니다.value"Hip Hop"

public class g1 //We've created an instance of the Genre Class called "g1"
{
    private string name;
    public string Name
    {
        get => name;
        set => name = "Hip Hop"; //instead of 'value', "Hip Hop" is written because 
                              //'value' in 'g1' was set to "Hip Hop" by previously
                              //writing 'g1.Name = "Hip Hop"'
    }
}

위의 예제는 실제로 코드로 작성되지 않았습니다. 백그라운드에서 진행되는 작업을 나타내는 가상의 코드에 가깝습니다.

이제 장르 의 g1 인스턴스 이름을 설정 했으므로 다음 을 작성하여 이름을 얻을 수 있다고 생각합니다.

console.WriteLine (g1.Name); //This uses the 'get' function from our 'Name' Property 
                             //and returns the field 'name' which we just set to
                             //"Hip Hop"

우리가 이것을 실행하면 "Hip Hop"콘솔에 들어갑니다.

이 설명의 목적을 위해 출력으로 예제를 완성하겠습니다.

using System;
public class Genre
{
    public string Name { get; set; }
}

public class MainClass
{
    public static void Main()
    {
        Genre g1 = new Genre();
        Genre g2 = new Genre();
        Genre g3 = new Genre();

        g1.Name = "Hip Hop";
        g2.Name = "Rock";
        g3.Name = "Country";

        Console.WriteLine ("Genres: {0}, {1}, {2}", g1.Name, g2.Name, g3.Name);
    }
}

산출:

"Genres: Hip Hop, Rock, Country"

18
개인적으로 나는 단지 그것을 그렇게 논평하고 set{name = value;} // 'value' here is equal to "Hip Hop"
싶습니다

2
@iLoveUnicorns, 데이터 추상화를 목적으로 합니다 . 백업 필드는 실제 데이터를 포함합니다. 속성 정의는 실제로 getset메서드를 사용하여 데이터에 액세스하는 방법을 정의합니다 . 내가 제공 한 링크는 페이지 상단의 John Guttag에서 훌륭한 인용을했습니다. 나는 그의 책을 읽고 추천하거나 걸릴 것 이 무료 온라인 과정
조시 톰슨

2
: public class Genre{public string Name;} 대신에 다음을 사용할 수는 없습니다 public class Genre{ public string Name { get; set; }}. 내 말은, 왜 우리는 {get; 세트; }?
user2048204

1
내 관심사가 이미 반향 된 것 같습니다. "public string Name {get; set;}"을 선언하면 다음과 같은 방법으로 액세스 할 수 있습니다. g1.Name = "Hip Hop"; 그러면 객체 방향은 어디에 있습니까? 소위 "백킹 필드"도 필요하지 않습니다. 내가 걱정하는 한, 뒷받침 분야는 존재하지 않습니다. 나는 공공 장소에만 접근하기 때문입니다. 공개 필드가 "public"이면 OO를 준수하지 않습니다. 모두 COBOL로 돌아 갑시다.
Baruch Atta

1
좋은 대답이지만, 만약 우리가 pedantic이라면,“set”은 접근자가 아닌 뮤 테이터입니다.
pythlang

100

그것들은 자동 속성입니다

기본적으로 지원 필드가있는 속성을 작성하는 다른 방법입니다.

public class Genre
{
    private string _name;

    public string Name 
    { 
      get => _name;
      set => _name = value;
    }
}

7
"백킹 필드"는 무엇입니까?
kn3l

4
@stackunderflow : 백업 필드는 데이터가 저장되는 위치입니다. (를 사용할 때 반환되고를 사용하여 get지속되는 것 set). 찬장처럼되는 getset의 문을 엽니 다.
그랜트 토마스

5
@stackunderflow :이 답변에서 백업 필드는 _name입니다. 자동 속성에서 백업 필드는 숨겨져 있습니다.
저스틴

36

이것은 이것을하는 짧은 방법입니다.

public class Genre
{
    private string _name;

    public string Name
    {
      get => _name;
      set => _name = value;
    }
}

33

비공개 데이터 멤버를 명시 적으로 만들 필요가 없도록 데이터 멤버를 공개로 표시하는 바로 가기입니다. C #은 개인 데이터 멤버를 생성합니다.

이 바로 가기를 사용하지 않고 데이터 멤버를 공개 할 수 있지만 데이터 멤버의 구현을 변경하여 일부 논리를 갖기로 결정한 경우 인터페이스를 중단해야합니다. 간단히 말해보다 유연한 코드를 만드는 바로 가기입니다.


2
Kelsey-이 구문이 어떻게 "유연한"코드를 만드는지 설명 할 수 있습니까? 나는 그것을 보지 못한다. setter 또는 getter에 "logic"을 추가하는 경우 ether의 경우 (비공개 데이터의 유무에 관계없이) 인터페이스를 그대로 중단하고 코딩이 필요합니다.
Baruch Atta

18

기본적으로 다음과 같은 바로 가기입니다.

class Genre{
    private string genre;
    public string getGenre() {
        return this.genre;
    }
    public void setGenre(string theGenre) {
        this.genre = theGenre;
    }
}
//In Main method
genre g1 = new Genre();
g1.setGenre("Female");
g1.getGenre(); //Female

5
이것은 질문에 대답하지 않습니다. OP는 속성에 대해 이야기하고있었습니다.
theB

6
나는 특성이 가져 알고 설정, 그것은 더 나은 도움을 이해하는 것이 한 예이다
Jirson Tavera


6

공용 속성 이름에 대한 접근 자입니다.

장르의 인스턴스에서 해당 속성의 값을 가져 오거나 설정하는 데 사용할 수 있습니다.


6

이것이 자동 구현 속성입니다. 기본적으로 C #에서 클래스에 대한 개인 변수를 정의하지 않고 클래스의 속성을 만드는 간단한 방법입니다. 일반적으로 변수 값을 가져 오거나 설정할 때 추가 로직이 필요하지 않을 때 사용됩니다.

MSDN의 Auto-Implemented Properties Programming Guide 에서 더 많은 내용을 읽을 수 있습니다 .


6
  • get / set 패턴은 인스턴스화 된 클래스의 속성 인스턴스 설정 ( 'set') 또는 검색 ( 'get') 중에 로직을 추가 할 수있는 구조를 제공합니다. 특성.

  • 속성은 'get'접근자를 가질 수 있으며,이 속성은 해당 속성을 읽기 전용으로 만들기 위해 수행됩니다.

  • get / set 패턴을 구현할 때 중간 변수는 값을 배치하고 값을 추출 할 수있는 컨테이너로 사용됩니다. 중간 변수는 일반적으로 밑줄로 시작합니다. 이 중간 변수는 get / set 호출을 통해서만 액세스 할 수 있도록하기 위해 비공개입니다. 그의 답변은 get / set 구현에 가장 일반적으로 사용되는 구문 규칙을 보여 주므로 Brandon의 답변을 참조하십시오.


5

즉, 장르 유형의 변수를 만들면 변수로 속성에 액세스 할 수 있습니다.

Genre oG = new Genre();
oG.Name = "Test";

5
자동 구현 속성을 사용하지 않는 경우에도 여전히 이런 방식으로 액세스 할 수 있습니다. 즉, AIP는 외부에서의 액세스가 아니라 클래스 내부의 선언에 관한 것입니다.
abatishchev

4

이러한 { get; set; }구문을 자동 속성, C # 3.0 구문이라고합니다.

컴파일하려면 Visual C # 2008 / csc v3.5 이상을 사용해야합니다. 그러나 .NET Framework 2.0 (이 기능을 지원하는 데 런타임 또는 클래스가 필요하지 않음)만큼 낮은 대상을 대상으로하는 출력을 컴파일 할 수 있습니다.


4

Visual Studio X에서 클래스에 속성을 정의 하고이 클래스를 형식으로 만 사용하려는 경우 프로젝트를 빌드 한 후 "필드 X는 할당되지 않으며 항상 기본값이 있음" 이라는 경고가 표시 됩니다. value " 입니다.

{ get; set; }X속성 을 추가 하면이 경고가 표시되지 않습니다.

또한 Visual Studio 2013 및 상위 버전에서 추가 { get; set; }하면 해당 속성에 대한 모든 참조를 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오


4

기본적으로 속기입니다. public string Name { get; set; }많은 예제에서와 같이 작성할 수 있지만 작성할 수도 있습니다.

private string _name;

public string Name
{
    get { return _name; }
    set { _name = value ; } // value is a special keyword here
}

왜 사용됩니까? 속성에 대한 액세스를 필터링하는 데 사용할 수 있습니다 (예 : 이름에 숫자를 포함하지 않기를 원함).

예를 들어 보겠습니다.

private class Person {
    private int _age;  // Person._age = 25; will throw an error
    public int Age{
        get { return _age; }  // example: Console.WriteLine(Person.Age);
        set { 
            if ( value >= 0) {
                _age = value; }  // valid example: Person.Age = 25;
        }
    }
}

공식적으로는 자동 구현 속성이라고하며 ( 프로그래밍 안내서 ) 를 읽는 좋은 습관 입니다. 튜토리얼 비디오 C # Properties : "get"및 "set"을 사용하는 이유 도 추천 합니다.


2

설정은 속성에 대한 액세스 수정 자입니다. Get은 속성 필드를 읽습니다. 설정은 속성 값을 설정합니다. Get은 읽기 전용 액세스와 같습니다. 설정은 쓰기 전용 액세스와 같습니다. 이 속성을 읽기 쓰기로 사용하려면 get 및 set을 모두 사용해야합니다.


1
나는 설정이 액세스 수정자가 아니라고 생각합니다. 실제로 그들은 접근 자입니다. 액세스 수정 자 : 공개, 개인, 내부 등
Rohit Arora

1

속성이 오른쪽 (RHS)에 나타날 때 Get이 호출됩니다. 속성이 '='기호의 왼쪽 (LHS)에 나타날 때 호출됩니다.

자동 구현 된 속성의 경우 배경 필드는 장면 뒤에서 작동하며 보이지 않습니다.

예:

public string Log { get; set; }

자동 구현되지 않은 속성의 경우 백업 필드가 선행되어 개인 범위 변수로 표시됩니다.

예:

private string log;

public string Log
{
    get => log;
    set => log = value;
}

또한 'getter'와 'setter'는 다른 'backing field'를 사용할 수 있습니다.


이것은 질문에 대답하지 않는 것 같습니다.
TylerH

get & set이 호출 될 때 제공되는 힌트. 위에서 언급 한 모든 답변은 get & set의 지원 필드가 동일하다는 인상을줍니다. 그러나 그렇지 않습니다. 내 대답은 주요 질문과 매우 관련이 있습니다. 당신이 저에게 동의 바랍니다
Bala

질문이 요구하는 자동 생성 속성의 경우 getter와 setter에 사용되는 다른 지원 필드가있을 수 없습니다. 하나의 백업 필드 만 있습니다. 자동이 아닌 속성 (질문이 묻지 않는)의 경우 개념적으로지지 필드가 전혀 없을 수도 있습니다. 또한 할당 연산자의 왼쪽에 게터가 있고 할당 연산자의 오른쪽에 세터가있는 프로그램을 작성할 수 있습니다. 따라서이 모든 정보가 질문에 대답하지 않았을뿐만 아니라 모두 잘못된 것입니다.
Servy

0

개인 변수 정의

생성자 내부에서 데이터로드

Constant를 만들고 상수에서 Selected List 클래스로 데이터를로드합니다.

public  class GridModel
{
    private IEnumerable<SelectList> selectList;
    private IEnumerable<SelectList> Roles;

    public GridModel()
    {
        selectList = from PageSizes e in Enum.GetValues(typeof(PageSizes))
                       select( new SelectList()
                       {
                           Id = (int)e,
                           Name = e.ToString()
                       });

        Roles= from Userroles e in Enum.GetValues(typeof(Userroles))
               select (new SelectList()
               {
                   Id = (int)e,
                   Name = e.ToString()
               });
    }

  public IEnumerable<SelectList> Pagesizelist { get { return this.selectList; } set { this.selectList = value; } } 
  public IEnumerable<SelectList> RoleList { get { return this.Roles; } set { this.Roles = value; } }
  public IEnumerable<SelectList> StatusList { get; set; }

}

0

속성은 개인 변수를 클래스의 다른 멤버와 분리하는 레이어와 비슷합니다. 외부 세계에서는 속성이 단지 필드 인 것처럼 느껴지며 속성을 사용하여 속성에 액세스 할 수 있습니다.

public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string FullName => $"{FirstName} {LastName}";
}

public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string FullName { get { return $"{FirstName} {LastName}"; } }
}

FullName은 속성입니다. 화살표가있는 것은 바로 가기입니다. 외부에서는 다음과 같이 FullName에 액세스 할 수 있습니다.

var person = new Person();
Console.WriteLine(person.FullName);

발신자는 FullName을 구현 한 방법에 신경 쓰지 않습니다. 그러나 클래스 내에서 원하는대로 FullName을 변경할 수 있습니다.

자세한 설명은 Microsoft 설명서를 확인하십시오.

https://docs.microsoft.com/en-us/dotnet/csharp/properties

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.