어떤 상황에서 사용해야 하는 개인정 속성에 대을 읽기 전용설턴트를 제공합니다. 고려 두 개의 매우 단순한 예 아래입니다.
첫 번째 예제:
Public Class Person
Private _name As String
Public Property Name As String
Get
Return _name
End Get
Private Set(ByVal value As String)
_name = value
End Set
End Property
Public Sub WorkOnName()
Dim txtInfo As TextInfo = _
Threading.Thread.CurrentThread.CurrentCulture.TextInfo
Me.Name = txtInfo.ToTitleCase(Me.Name)
End Sub
End Class
// ----------
public class Person
{
private string _name;
public string Name
{
get { return _name; }
private set { _name = value; }
}
public void WorkOnName()
{
TextInfo txtInfo = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo;
this.Name = txtInfo.ToTitleCase(this.Name);
}
}
두 번째 예제:
Public Class AnotherPerson
Private _name As String
Public ReadOnly Property Name As String
Get
Return _name
End Get
End Property
Public Sub WorkOnName()
Dim txtInfo As TextInfo = _
Threading.Thread.CurrentThread.CurrentCulture.TextInfo
_name = txtInfo.ToTitleCase(_name)
End Sub
End Class
// ---------------
public class AnotherPerson
{
private string _name;
public string Name
{
get { return _name; }
}
public void WorkOnName()
{
TextInfo txtInfo = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo;
_name = txtInfo.ToTitleCase(_name);
}
}
그들이 양쪽은 같은 결과입니다. 이 상황에있는's 없는 옳고 그름,그리고 그's just a matter of preference?
거기에 몇 가 사용하는 이유는개인정
.
1)를 사용하지 않는 경우 백업 분야에서든 원하는 읽기 전용 자동적인 속성:
public string Name { get; private set; }
public void WorkOnName()
{
TextInfo txtInfo = Thread.CurrentThread.CurrentCulture.TextInfo;
Name = txtInfo.ToTitleCase(Name);
}
2)원하는 경우 추가 작업을 할 경우 수정할 변수의 내부 클래스고 캡처하는 단 하나 위치에 있:
private string _name = string.Empty;
public string Name
{
get { return _name; }
private set
{
TextInfo txtInfo = Thread.CurrentThread.CurrentCulture.TextInfo;
_name = txtInfo.ToTitleCase(value);
}
}
하지만,일반적으로,그's 제 개인적인 선호도에 따라 다릅니다. 직까지 없는 성능을 사용하는 이유 중 하나입니다.
사용개인정고 싶을 때setter 수 있't 액세스 외부에서.
사용readonly하고 싶을 때****설정의 속성은 한 번만**. 에서 생성자 또는 변수 이니셜라이저입니다.
이 테스트:
void Main()
{
Configuration config = new Configuration();
config.ResetConfiguration();
ConfigurationReadOnly configRO = new ConfigurationReadOnly();
configRO.ResetConfiguration();
}
public class Configuration
{
public Color BackgroundColor { get; private set; }
public Color ForegroundColor { get; private set; }
public String Text { get; private set; }
public Configuration()
{
BackgroundColor = Color.Black;
ForegroundColor = Color.White;
Text = String.Empty;
}
public void ResetConfiguration()
{
BackgroundColor = Color.Black;
ForegroundColor = Color.White;
Text = String.Empty;
}
}
public class ConfigurationReadOnly
{
public readonly Color BackgroundColor;
public readonly Color ForegroundColor;
public readonly String Text;
public ConfigurationReadOnly()
{
BackgroundColor = Color.Black;
ForegroundColor = Color.White;
Text = String.Empty;
}
public void ResetConfiguration()
{
BackgroundColor = Color.Black; // compile error: due to readonly keyword
ForegroundColor = Color.White; // compile error: due to readonly keyword
Text = String.Empty; // compile error: due to readonly keyword
}
}
용할 수 있는 세 번째 옵션?
public class Person
{
public string Name { get; protected set; }
public void SetName(string name)
{
TextInfo txtInfo = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo;
this.Name = txtInfo.ToTitleCase(name);
}
}
이것은 이름이 속성을 효과적으로 읽기만 하는 모든 외부 코드는 명시적으로 설정 방법입니다. 내가 선호하는 명시적으로 설정 보다는 오히려 단순히 사용하여 설정에 이름을 제공하기 때문에 당신이 변화하는 값을 설정할 때. 는 경우에 일반적으로 당신이 설정속성 값을,당신은 당신을 얻을 것으로 예상 같은 값을 다시 호출할 때를 얻을,나중에는 일어나지 않았다면 당신의 totitlecase 메서드에서 설정.
그러나,당신이 말했듯이 없다는 것입니다.
에서 시작 C#6.0,getter-자동 속성이 추가되었습니다. 는 여기를 참조하십시오:https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6#getter-only-auto-properties.
여기's 예를 들어:
public class SomeClass
{
public int GetOnlyInt { get; }
public int GetOnlyIntWithInitializer { get; } = 25;
public SomeClass(int getOnlyInt)
{
GetOnlyInt = getOnlyInt;
}
}
Don't 를 사용하여 두 번째 예입니다. 전체적인 포인트 사용하는 속성이 있는 경우에도 아무것을 넘어 getter 얻고 세터 설정하는 것입니다-깔대기 모두를 통해 액세스하는 getter 및 세터 그래서 만약 당신이 이제까지를 변경해야 할 행동을 장래에,그's 의 하나에 모든 장소입니다.
당신의 두 번째 예제를 포기하는 경우에는 설정을 제공합니다. 사용한 경우에는 접근 방식에서는 대형,복잡한 클래스고,나중에 변경이 필요하의 행동을 제공,당신은 당'd 야에서 검색-과-대체 땅이 만드는 대신 변경을 한 곳에서-프라이빗하였습니다.
때마다 나는've 필요에 대한 액세스 권한을 변경하려면의 수준 세터,나는've 일반적으로 그것을 변경하거나 보호된(이 클래스와 파생 클래스를 변경할 수 있습 값)또는 친구(회원만의 어셈블리를 변경할 수 있습 값).
그러나 사용하여 개인을 만드는 완벽한 감각을 할 때에 다른 작업을 세터 변경 외 백 값입니다. 앞서 지적한 바와 같이,그's 좋은 디자인을 참조하지 않신의 역행 값을 직접 그러나 대신에만 액세스를 통해 그들을 자신의 속성입니다. 다는 것을 보장하는 나중에 변경한 내용은 속성에 적용된 내부적으로뿐만 아니라 외부. 고 있's 거의 없는 성능을 참조하 속성 vs 지원 변수입니다.
고 있's 거의 없는 성능이 저하...
하지만,명확하게 액세스 제공은느린 것보다 액세스하지 변수입니다. 속's getter 및 setter 는 방법을 필요로 하는 전화 및 반환,반면 속's backing 변수를 직접 액세스.
는's why,는 경우에는 속's getter 액세스할 수 있습니다 많은 시간 내에 있는 코드 블록 호텔's 값은 때때로 캐시 첫(에 저장된 지역 변수)그리고 지역 변수 사용합니다. 물론,가정을 제공할 수 있't 이 변경 될 비동기적으로는 블록 실행됩니다.