Getters, setters 및 properties의 베스트 프랙티스.자바와C#
저는 지금 C# 수업을 듣고 있는데 가장 좋은 방법을 찾고 있어요.저는 Java 출신이기 때문에 Java의 베스트 프랙티스밖에 모릅니다.C# 초보자입니다.
자바에서는 개인 재산이 있으면 이렇게 합니다.
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
C#에서는 여러 가지 방법이 있습니다.
Java처럼 할 수 있습니다.
private string name;
public void setName(string name) {
this.name = name;
}
public string getName() {
return this.name;
}
또는 다음과 같이 할 수 있습니다.
private string name;
public string Name {
get { return name; }
set { name = value; }
}
또는 다음 중 하나를 선택합니다.
public string Name { get; set; }
어떤 것을 사용해야 하며, 각 접근법에 관련된 주의사항 또는 세부사항은 무엇입니까?클래스를 만들 때는 Java에서 알고 있는 일반적인 베스트 프랙티스(특히 유효한 Java 읽기)를 따르고 있습니다.예를 들어, 저는 불변성(필요한 경우에만 설정기 제공)을 선호합니다.이러한 프랙티스가 C#에서 세터 및 게터를 제공하는 다양한 방법에 어떻게 적합한지 궁금할 뿐입니다.기본적으로 Java의 베스트 프랙티스를 C#으로 변환하려면 어떻게 해야 할까요?
편집
Jon Sket의 답변에 대한 코멘트로 이 글을 올렸으나 시간이 길어졌다.
중요하지 않은 속성(예: 상당한 처리 및 유효성 검사)은 어떻습니까?될 수 요?그래도 은 '공용재산'에 . 하지만 로직은get
★★★★★★★★★★★★★★★★★」set
전용 세터 및 게터 방식(관련된 처리 및 검증 로직 포함)을 사용하는 것보다 이 작업을 수행할 필요가 있는 이유는 무엇입니까?
C#6 이전
난 이 물건들 중 마지막 것을 사소한 재산으로 쓸 거야.주의: 저는 이것을 공공 재산이라고 부릅니다.게터와 세터 모두 공공 재산이기 때문입니다.
불변성은 자동으로 구현되는 속성의 다소 골칫거리입니다.게터만 있는 자동 속성은 작성할 수 없습니다.최대한 가까운 것은 다음과 같습니다.
public string Foo { get; private set; }
정말 불변은 아니지만...네 교실 밖에서는 불변이야따라서 다음과 같은 실제 읽기 전용 속성을 사용할 수 있습니다.
private readonly string foo;
public string Foo { get { return foo; } }
은 절대 할 거예요.getName()
★★★★★★★★★★★★★★★★★」setName()
속성을 사용하지 않고 Get/Set 메서드를 작성하는 것이 타당할 수 있습니다.특히 비용이 많이 들고 그것을 강조하고 싶은 경우에는 더욱 그렇습니다.다만, 에 따라 주세요.메서드에 대한 Pascal Case의 NET 명명 규칙입니다.또한 이러한 사소한 속성을 일반 메서드로 구현하고 싶지 않습니다.여기서 속성은 훨씬 더 관용적입니다.
C# 6
드디어 적절한 읽기 전용 자동 구현 속성이 추가되었습니다.
// This can only be assigned to within the constructor
public string Foo { get; }
마찬가지로 일부 작업을 수행해야 하는 읽기 전용 속성의 경우에도 멤버 본문 속성을 사용할 수 있습니다.
public double Area => height * width;
일부 데이터를 저장할 변수만 필요한 경우:
public string Name { get; set; }
읽기 전용으로 표시하시겠습니까?
public string Name { get; private set; }
아니면 더 좋은...
private readonly string _name;
...
public string Name { get { return _name; } }
속성을 할당하기 전에 값 검사를 수행하시겠습니까?
public string Name
{
get { return m_name; }
set
{
if (value == null)
throw new ArgumentNullException("value");
m_name = value;
}
}
GetXyz() SetXyz()는 Gut을 사용합니다.일반적으로 대부분의 get/set 속성은 논리가 많지 않고 예기치 않은 부작용이 거의 없을 것으로 예상합니다.을 받아야 필요한 를 호출하거나 사용자로부터 하는 과 같이 .BuildXyz()
보다GetXyz()
.
메서드를 가져오거나 설정하지 않고 C# 속성을 사용합니다.그들은 당신의 편의를 위해 그곳에 있고 그것은 관용적이다.
당신의 두 C#의 예에 대해 말하자면, 하나는 단순히 다른 하나는 통사설탕입니다.인스턴스 변수 주위에 단순한 래퍼만 필요한 경우 auto 속성을 사용하고, getter 및/또는 setter에 논리를 추가해야 할 경우 풀 버전을 사용합니다.
C#에서는 get 및/또는 set의 개인 필드를 노출하기 위한 속성을 선호합니다.말씀하신 형식은 get 및 set에 의해 자동으로 피벗백 필드가 생성됩니다.
가능하면 자동 속성을 선호하지만 C#에서 set/get 메서드 쌍을 실행해서는 안 됩니다.
public string Name { get; set; }
이는 단순히 자동 구현된 속성으로, 기술적으로 일반 속성과 동일합니다.컴파일 시 백업필드가 생성됩니다.
모든 속성은 최종적으로 함수로 변환되므로 최종적으로 컴파일된 실제 구현은 Java에서 익숙한 것과 동일합니다.
백업 필드에서 특정 작업을 수행할 필요가 없는 경우 자동 구현 속성을 사용하십시오.그렇지 않으면 일반 자산을 사용하십시오.작업에 부작용이 있거나 계산 비용이 많이 드는 경우 get 및 set 함수를 사용하고 그렇지 않은 경우 속성을 사용합니다.
C#에서 어떤 방법을 선택하든 최종 결과는 동일합니다.getter 메서드와 setter 메서드가 다른 backing 변수를 얻을 수 있습니다.속성을 사용하는 것은 베스트 프랙티스를 따르고 있기 때문에 얼마나 상세하게 설명하느냐에 따라 달라집니다.
인 auto-properties를 합니다.auto-properties는 auto-properties입니다.public string Name { get; set; }
이치노향후 검증 등의 추가가 필요한 경우 언제든지 확장할 수 있습니다.
하면 공공의 이 좋다string Name { get; set; }
간결하고 읽기 쉽기 때문입니다.이게 도 있어요.
private string name;
public string Name {
get { return name; }
set { name = value; }
}
에서는 C#이 아닌 .getX()
★★★★★★★★★★★★★★★★★」setX()
과 set을 모두 속성을가질 수 .또한 C#은 속성에 get과 set을 모두 가질 필요가 없습니다.get-only 속성과 set-only 속성을 가질 수 있습니다.
public boolean MyProperty
{
get { return something; }
}
public boolean MyProperty
{
set { this.something = value; }
}
먼저 당신이 쓴 글을 설명하겠습니다.
// private member -- not a property
private string name;
/// public method -- not a property
public void setName(string name) {
this.name = name;
}
/// public method -- not a property
public string getName() {
return this.name;
}
// yes it is property structure before .Net 3.0
private string name;
public string Name {
get { return name; }
set { name = value; }
}
이 구조는 오늘날에도 사용되고 있습니다만, 예를 들어 값이 설정되어 있는 경우 해석하여 대문자로 변환하고 내부 사용을 변경하기 위해 개인 멤버에 저장할 수 있습니다.
.net Framework 3.0 사용
// this style is introduced, which is more common, and suppose to be best
public string Name { get; set; }
//You can more customize it
public string Name
{
get;
private set; // means value could be set internally, and accessed through out
}
C#에서 행운을 빕니다.
전술한 바와 같이, 이러한 접근방식은 모두 같은 결과를 낳습니다.가장 중요한 것은 규약을 선택하고 그것을 고수하는 것이다.마지막 두 가지 특성 예를 사용하는 것이 좋습니다.
이 답변의 대부분과 마찬가지로 자동 속성을 사용합니다.직관적이고 코드 행이 적으며 보다 깔끔합니다.할 필요가 있는 는, 를 붙입니다.[Serializable]
/ / / /[DataConract]
기여하다.그리고 만약 당신이 그것을 사용하고 있다면[DataContract]
[DataMember(Name="aMoreFriendlyName")]
public string Name { get; set; }
개인 또는 퍼블릭세터는 사용자의 취향에 따라 달라집니다.
또한 자동 속성에는 getter와 setter(public 또는 private)가 모두 필요합니다.
/*this is invalid*/
public string Name
{
get;
/* setter omitted to prove the point*/
}
또는 get/set만 원하는 경우 직접 backing 필드를 만듭니다.
어떤 것을 사용해야 하며, 각 접근법에 관련된 주의사항 또는 세부사항은 무엇입니까?
속성을 사용할 때 아직 언급되지 않은 한 가지 경고가 있습니다.속성의 경우 getter 또는 setter의 파라미터화는 할 수 없습니다.
예를 들어 목록 항목을 가져오고 동시에 필터를 적용한다고 가정합니다.get-method를 사용하면 다음과 같이 쓸 수 있습니다.
obj.getItems(filter);
반면 속성에서는 먼저 모든 항목을 반환해야 합니다.
obj.items
다음 단계에서 필터를 적용하거나 다른 기준으로 필터링된 항목을 노출하는 전용 속성을 추가해야 합니다. 그러면 API가 곧 확장됩니다.
obj.itemsFilteredByX
obj.itemsFilteredByY
때때로 성가신 일이 될 수 있는 것은, 예를 들면, 속성으로 시작한 경우입니다.obj.items
ter 、 getter 、 setter - parametersrization 、 API 는는는는는 。이제 API를 다시 작성하여 코드 내의 이 속성에 액세스하는 모든 위치를 수정하거나 대체 솔루션을 찾아야 합니다.get-method의 를 들어 get-method의 경우 get-method의 경우 get-method의 경우 get-method의 경우 get-method의 경우 get-method의 경우.obj.getItems()
메서드의 시그니처를 확장하여 옵션인 "설정" 개체를 받아들이도록 할 수 있습니다. obj.getItems(options)
당신의 방식을 부르는 모든 장소를 다시 쓸 필요 없이 말이죠.
C#의 (자동 실장된) 속성은 대부분의 시간 파라미터화가 필요하지 않을 수 있기 때문에 (여기서 설명한 다양한 이유로) 여전히 매우 유용한 숏컷입니다만, 이 주의는 유효합니다.
언급URL : https://stackoverflow.com/questions/4948816/getters-setters-and-properties-best-practices-java-vs-c-sharp
'programing' 카테고리의 다른 글
Laravel에서 created_at만 사용하는 방법 (0) | 2022.09.14 |
---|---|
알 수 없는 사용자 지정 요소? (0) | 2022.09.14 |
팬더 데이터 프레임에 누락된 날짜 추가 (0) | 2022.09.14 |
Netbeans 8.2의 VueJ에서 사용할 수 있는 플러그인이 있습니까? (0) | 2022.09.14 |
컨테이너 프로세스를 시작하여 "exec: \"bash\": $PATH에서 실행 파일을 찾을 수 없음: 알 수 없음 (0) | 2022.09.14 |