C# 9 레코드는 기본적으로 변경할 수 없습니까?
with
expressions , inheritance 및 positional records , 너무. 우리는 마침내 많은 해키 상용구 없이 C#에서 불변성을 시행할 수 있습니다.이것은 질문을 던집니다.
record
유형을 선언하고 즉시 불변성을 얻을 수 있습니까? 레코드는 기본적으로 변경 불가능하다고 말하는 사람도 있고 그렇지 않다고 말하는 사람도 있습니다. 두 진술 모두 정확합니다. 이유를 설명하겠습니다.위치 구문을 사용하는 레코드는 기본적으로 변경할 수 없습니다.
일반적으로 위치 스타일을 사용하여(생성자를 사용하여 인수 목록을 전달하여 개체를 만드는 방식으로) 개체를 만드는 경우 기본적으로 레코드는 변경할 수 없습니다.
예를 들어 위치 스타일을 사용하면 한 줄의 코드로 Person
레코드를 선언할 수 있습니다.
record Person(string FirstName, string LastName);
그런 다음 Main
메서드에서 다음과 같이 할 수 있습니다.
static void Main(string[] args)
{
var person = new Person("Dave", "Brock");
Console.WriteLine($"I'm {person.FirstName} {person.LastName}");
}
가장 중요한 것은 초기화 후 내 FirstName
속성을 변경하려고 하면…
person.FirstName = "Bob";
... 내 컴파일러가 다음 오류와 함께 화를 냅니다. Init-only property or indexer 'Person.FirstName' can only be assigned in an object initializer, or on 'this' or 'base' in an instance constructor or an 'init' accessor.
예, 위치 레코드를 사용하는 경우 기본적으로 변경할 수 없습니다. 여기에서 .cs 파일에 한 줄 유형을 선언해야 하는지 여부에 대해 팀과 자유롭게 논쟁할 수 있습니다.
명목 생성을 사용하는 레코드는 기본적으로 변경할 수 없습니다.
C# 9에서 레코드로 작업하는 또 다른 방법이 있습니다. 영원히 해오던 전통적인 getter 및 setter를 사용하여 레코드를 선언할 수 있습니다.
public record Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
여기서는 객체 이니셜라이저 구문을 사용하여 명목 생성을 사용하고 있습니다. C# 9에서 이 작업을 수행하면 인스턴스화 후 속성을 변경할 수 있는 다음과 같은 작업을 중단할 수 없습니다.
static void Main(string[] args)
{
var person = new Person
{
FirstName = "Dave",
LastName = "Brock"
};
Console.WriteLine($"I'm {person.FirstName} {person.LastName}"); // I'm Dave Brock
person.FirstName = "Bob";
Console.WriteLine($"I'm {person.FirstName} {person.LastName}"); // I'm Bob Brock
}
위치 생성을 사용하면 기본적으로 레코드가 변경되지 않는다고 말할 수 있습니다.
물론 이것을 불변으로 만드는 것은 set
를 init
로 변경하는 간단한 작업입니다.
public record Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
이렇게 하면 컴파일러는 인스턴스화 후 속성 변경에 대해 다시 불평합니다. Init-only property or indexer 'Person.FirstName' can only be assigned in an object initializer, or on 'this' or 'base' in an instance constructor or an 'init' accessor.
나는 위치적 방법과 명목적 방법을 모두 사용하는 나를 볼 수 있다. 전체 레코드를 변경할 수 없는 경우에는 명목 메서드를 사용하고, 변경할 수 없는 속성과 그렇지 않은 속성에 대해 더 자세히 알고 싶을 때는 명목형 생성을 사용합니다. 예를 들어, 이 어리석고 간단한 예에서 FirstName
는 변경할 수 없지만 LastName
는 유지하지 않을 수 있습니다(결혼과 이혼을 위한 공간 만들기).
record Person
{
public string FirstName { get; init; }
public string LastName { get; set; }
}
레코드가 완전히 변경 불가능해야 한다고 주장하는 개발자가 많이 있습니다. 그러나 C#과 같은 자연적으로 변경 가능한 언어에서는 둘 다에 대한 옵션이 의도적으로 존재합니다.
뭘 쓰든 기록은 버그가 많은 행사보다 낫지
어떤 방법을 선택하든 readonly struct
또는 IEquatable
인터페이스를 구현하는 클래스를 사용하여 C# 8에서 불변성을 적용하는 것보다 훨씬 낫습니다.
예를 들어, C# 8에서는 구현하기 위해 다음 식을 작성합니다IEquatable
.
class Person : IEquatable<Person>
{
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public string FirstName { get; set; }
public string LastName { get; set; }
public bool Equals(Person other)
{
// write some Equals override to compare
// from data in the object and not reference itself
throw new NotImplementedException();
}
}
값과 같은 평등을 적용하려면 자체 Equals
재정의를 작성해야 하며 결국 GetHashCode
및 ToString
재정의도 완료될 것입니다. 레코드를 사용하면 명목 또는 위치 규칙을 사용하여 많은 의식을 제거할 수 있습니다. 개체에 추가하는 새 속성으로 코드를 업데이트하는 것을 잊었을 때 피할 수 없는 버그는 말할 것도 없고요.
마무리
이 게시물에서 우리는 C# 9 레코드가 기본적으로 변경 불가능한 경우와 변경 불가능한 경우에 대해 이야기했습니다. 또한 두 접근 방식이 C# 8 또는 이전 버전에서 강제로 생성해야 했던 버그 의식을 능가하는 방법을 보여주었습니다.
Reference
이 문제에 관하여(C# 9 레코드는 기본적으로 변경할 수 없습니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/daveabrock/are-c-9-records-immutable-by-default-2e0d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
record Person(string FirstName, string LastName);
static void Main(string[] args)
{
var person = new Person("Dave", "Brock");
Console.WriteLine($"I'm {person.FirstName} {person.LastName}");
}
person.FirstName = "Bob";
C# 9에서 레코드로 작업하는 또 다른 방법이 있습니다. 영원히 해오던 전통적인 getter 및 setter를 사용하여 레코드를 선언할 수 있습니다.
public record Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
여기서는 객체 이니셜라이저 구문을 사용하여 명목 생성을 사용하고 있습니다. C# 9에서 이 작업을 수행하면 인스턴스화 후 속성을 변경할 수 있는 다음과 같은 작업을 중단할 수 없습니다.
static void Main(string[] args)
{
var person = new Person
{
FirstName = "Dave",
LastName = "Brock"
};
Console.WriteLine($"I'm {person.FirstName} {person.LastName}"); // I'm Dave Brock
person.FirstName = "Bob";
Console.WriteLine($"I'm {person.FirstName} {person.LastName}"); // I'm Bob Brock
}
위치 생성을 사용하면 기본적으로 레코드가 변경되지 않는다고 말할 수 있습니다.
물론 이것을 불변으로 만드는 것은
set
를 init
로 변경하는 간단한 작업입니다.public record Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
이렇게 하면 컴파일러는 인스턴스화 후 속성 변경에 대해 다시 불평합니다.
Init-only property or indexer 'Person.FirstName' can only be assigned in an object initializer, or on 'this' or 'base' in an instance constructor or an 'init' accessor.
나는 위치적 방법과 명목적 방법을 모두 사용하는 나를 볼 수 있다. 전체 레코드를 변경할 수 없는 경우에는 명목 메서드를 사용하고, 변경할 수 없는 속성과 그렇지 않은 속성에 대해 더 자세히 알고 싶을 때는 명목형 생성을 사용합니다. 예를 들어, 이 어리석고 간단한 예에서
FirstName
는 변경할 수 없지만 LastName
는 유지하지 않을 수 있습니다(결혼과 이혼을 위한 공간 만들기).record Person
{
public string FirstName { get; init; }
public string LastName { get; set; }
}
레코드가 완전히 변경 불가능해야 한다고 주장하는 개발자가 많이 있습니다. 그러나 C#과 같은 자연적으로 변경 가능한 언어에서는 둘 다에 대한 옵션이 의도적으로 존재합니다.
뭘 쓰든 기록은 버그가 많은 행사보다 낫지
어떤 방법을 선택하든 readonly struct
또는 IEquatable
인터페이스를 구현하는 클래스를 사용하여 C# 8에서 불변성을 적용하는 것보다 훨씬 낫습니다.
예를 들어, C# 8에서는 구현하기 위해 다음 식을 작성합니다IEquatable
.
class Person : IEquatable<Person>
{
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public string FirstName { get; set; }
public string LastName { get; set; }
public bool Equals(Person other)
{
// write some Equals override to compare
// from data in the object and not reference itself
throw new NotImplementedException();
}
}
값과 같은 평등을 적용하려면 자체 Equals
재정의를 작성해야 하며 결국 GetHashCode
및 ToString
재정의도 완료될 것입니다. 레코드를 사용하면 명목 또는 위치 규칙을 사용하여 많은 의식을 제거할 수 있습니다. 개체에 추가하는 새 속성으로 코드를 업데이트하는 것을 잊었을 때 피할 수 없는 버그는 말할 것도 없고요.
마무리
이 게시물에서 우리는 C# 9 레코드가 기본적으로 변경 불가능한 경우와 변경 불가능한 경우에 대해 이야기했습니다. 또한 두 접근 방식이 C# 8 또는 이전 버전에서 강제로 생성해야 했던 버그 의식을 능가하는 방법을 보여주었습니다.
Reference
이 문제에 관하여(C# 9 레코드는 기본적으로 변경할 수 없습니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/daveabrock/are-c-9-records-immutable-by-default-2e0d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
class Person : IEquatable<Person>
{
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public string FirstName { get; set; }
public string LastName { get; set; }
public bool Equals(Person other)
{
// write some Equals override to compare
// from data in the object and not reference itself
throw new NotImplementedException();
}
}
이 게시물에서 우리는 C# 9 레코드가 기본적으로 변경 불가능한 경우와 변경 불가능한 경우에 대해 이야기했습니다. 또한 두 접근 방식이 C# 8 또는 이전 버전에서 강제로 생성해야 했던 버그 의식을 능가하는 방법을 보여주었습니다.
Reference
이 문제에 관하여(C# 9 레코드는 기본적으로 변경할 수 없습니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/daveabrock/are-c-9-records-immutable-by-default-2e0d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)