2009-10-01 3 views
9

저는 VS2008 (http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx)의 코드 계약서를 가지고 놀았습니다.
그들은 확실히 좋고 방법 안의 if-then-throw 검사에 대한 견고한 대안을 제공합니다..NET 4.0의 코드 계약, nullableable 참조 유형 팬을위한 기쁨 없음?

그럼에도 불구하고 필자는 nullable이 아닌 참조 유형에 대해 강하게 느끼는 필요성을 충족시킬 수 있기를 희망했습니다.
아아, 내가 볼 수있는 것에서 볼 때 그렇진 않습니다.

이 같은
  • 뭔가가 여전히 실행시 문제가 발생합니다 :
    이 내가 이해 것입니다
    MyClass a = null;
    a.ToString();

    난 아직 명시 적으로도 더 간결하고 효율적인 방법으로 경우, 수표를 작성해야
  • .

  • VS Team System을 사용하지 않는 한 런타임에서 체크하는 데 코드 계약 만 사용할 수 있으며 컴파일 타임에는 이점이 없습니다.
    뭔가 잘못되었을 때 여전히 문제를 처리해야한다는 의미입니다.
    간단한 예외 처리와 크게 다르지 않습니다.

  • VSTS를 사용하더라도 정적 분석은 런타임시 수행되는 것만 큼 좋지 않습니다.
    이것은 완벽하게 이해할 수 있지만,이 기능은 런타임 사용을위한 것입니다.

내가 틀렸다면하지만 코드 계약 내 인생을 더 쉽게 만들 수있는 방법은 없습니다 참조 및 비 - 널 (NULL) 참조 형식 같은 것, 내 프로그램보다 강력한 것과 저를 수정하십시오.

잘못 이해하지 마십시오. 코드 계약을 싫어하지 않습니다.
그들은 전체 프레임 워크에 대한 아주 좋은 향상입니다.
C#에서 null이 아닌 참조 형식을 사용하지 않아서 채워지는 간격을 채우지 않으면이 시점에서 아무 것도 볼 수 없게됩니다.
당신은 어떻게 생각하십니까?

+0

음 ... Nullable * 참조 유형으로 재생하기위한 프로토 타입이 (2017) 있습니다. [내 대답은 아래 참조하십시오] (https://stackoverflow.com/a/47339130/6309) – VonC

답변

20

나는 이것에 대해 정확하다고 생각합니다. 컴파일 타임에 Null을 허용하지 않는 참조 검사는 코드 계약에서 기다리고 있던 킬러 기능이었으며 실제로 존재하지 않았습니다.

이것이 무엇을 의미하는지 궁금해하는 사람들을 위해 값 유형을 유추 해보십시오.그들은 처음에 널 (NULL) 입력이 불가능했다,하지만 당신은 유형의 이름 뒤에 물음표를 넣어 경우 지금은 다음과 같습니다 동일 참조 유형의 사실 경우 일관성을 위해

int? n; 

이 이상적 일 것이다. 그러나 이는 기존의 모든 C# 프로그램을 손상시킬 수 있으므로 옵션이 아닙니다. 연구 언어 Spec# 그들은 비 - 널 (NULL)을 의미하는 느낌표 접미사를 사용하여 갔다 :

string! s = "Hello"; 

일반 값 유형과 마찬가지로, 컴파일러는 정적으로이 전에 string! 변수가 코드 경로에 사용되지 않음을 확인 초기화되었습니다 (필자는 SpeC#이 선언문과 초기화가 동일한 문장에서 발생해야한다고 믿는다). 또한 null의 할당을 해당 변수에 금지합니다.

물론 일반 string의 할당을 string!으로 금지합니다. 그러면 두 종류의 유형 간 격차를 메우는 방법은 무엇입니까? 수표를 작성하여 :

string x = GetStringFromSomewhere(); 

if (x != null) 
    s = x; // okay because compiler sees null check 

슬픈 진실은 대부분의 프로그램에서 참조 변수의 대부분은 프로그램이 올바른 경우 null이 가능성이 있다는 것입니다. Nullable 변수는 소수입니다. 그럼에도 불구하고 그들은 기본값입니다.

Another bad idea from the 1960s!

+1

'default (string!)'은 무엇이 될까요? 기본 생성자로 초기화 된 struct에서 'string!'필드의 값은 무엇입니까? – configurator

+1

이러한 경우는 단순히 컴파일하면 안됩니다.'default (string!)'은 모순입니다. "값을 읽기 전에 초기화해야하는 항목의 초기화 전 값은 무엇입니까?" 그리고 아마도 null이 아닌 필드는 구조체에 전혀 허용 될 필요가 없습니다. 구조체는 이미 엉터리입니다. –

+1

하나의 짜증나는 사실은 CLR이 * 모든 생성자를 실행하지 않고 클래스의 객체를 만들 수 있도록하는 모호한 방법이 있다는 것입니다. 그러나 이것을 사용하면 모든 베팅이 해제됩니다. 이것은 어떤 병적 인 상황에서'T! '의 값이'null'일 수 있음을 의미합니다. –

3

"nullable이 아닌 참조 유형"으로 어떤 문제가 해결되는지 모르겠습니다. 좋아, 그래서이 코드는 예외를 던져 훨씬 적은 것 같다 : -

a.ToString(); 

그러나 더 이상 그것은 비 - 널 (NULL) 때문에 올바른 될 가능성이 높습니다? a의 초기 값은 무엇입니까? 아마도 유형의 일부 "빈"인스턴스입니다. 이 경우 값을 지정해야하는 값에는 디버그가 어려워 질 가능성이 높습니다. 예외를 발생시키기보다는 기본 동작을 사용하는 것이 내가 원하는 것 같지는 않습니다.

+0

당신의 요점을 볼 수 있지만 정말 변수를 선언 할 때 참조를 제공하거나 클래스를 인스턴스화하는 데 신경 쓰지 않을 것입니다. – RobSullivan

+1

그러나 많은 경우에 선언 지점에서 변수에 __correct__ 참조를 제공 할 수 없기 때문에 임시 변수를 지정하십시오. 그렇다면 다시 사각형으로 돌아갑니다. 또한 nullable이 아닌 경우 변수에 대한 모든 할당에 대해 런타임 검사가 필요하므로 할당되는 항목이 null인지 확인해야합니다. – AnthonyWJones

+1

"null 참조를 피하십시오"라는 값으로 모든 변수를 선언하지 않기를 바랍니다. 변수를 만들고 값을 할당해야하는 이유가 있어야합니다. 올바른 값을 제공 할 수있는 위치에 있지 않다면 API/코드가 상당히 손상됩니다. – MichaelGG

-2

널 (null)

3

내가 nullable이 아닌 참조 형의 개념은 데이터베이스에 매핑 ORM 생성 된 속성에 대한 정말 유용 할 것이라고 생각 할 필요가 없다 오히려 당신이 String.Empty로 같은 기본을 사용할 수 있습니다 null을 사용하는 것보다 전지. 종종 기본 필드가 nullable인지 아닌지 여부를 속성 (대개 유형 문자열)에서 알 수 없습니다. nullable 값 유형을 사용하면 물음표를 찾을 수 있습니다.

필자는 명백한 foo를 제외하고는 정적 검사를 너무 걱정하지 않는다! = null; 실패하지만 인텔리 센스는 다양한 의도에 대한 힌트로서 매우 유용 할 것이라고 생각합니다.

0

컴파일 타임에 Null 허용 참조 검사가 코드 계약에서 기다렸던 킬러 기능이었으며 실제로 존재하지 않습니다.

업데이트 2017 (8 년 후) nullable이 아닌 참조 유형이 아직 없습니다 ... null 입력 참조 유형 일 수 있습니다.

Mads Torgersen (마이크로 소프트 C# 언어의 오후) 그것을 in this tweet를 언급하지 :

널 (NULL) 참조 유형의 프로토 타입이 여기에 드디어!

자세한 내용은 "Introducing Nullable Reference Types in C#"및이 비디오 "new features available C# 7.1 and 7.2"에 있습니다.

새로운 "안전"종류의 참조 유형을 추가 한 다음 기존 참조 유형을 다른 "안전한"유형으로 재 해석하면이 작업을 수행 할 수 있습니다.우리는 그것을 참조를하지하고자하는 일반적인이라고 생각

: 더 구체적으로, 우리는 같은 문자열이 달려 있지 않은 참조 형의 기본 의미는 몇 가지 이유를 들어, nullable이 아닌 참조 형해야한다고 생각 널이 되라. Nullable 참조 유형은 희귀 한 종류이 될 수 있습니다 (Google에서 얼마나 많은 양을 알려주지는 못했지만). 따라서 새로운 주석이 필요한 참조 유형입니다. 언어에는 이미 - 및 nullable value types에 대한 구문이 있습니다. 이 둘의 유추는 언어 추가를 개념적으로 더 쉽고 언어 적으로 더 간단하게 만들 것입니다.
당신이 적극적으로 당신이 그들을 원한다고 결정하지 않으면 성가신 null 값으로 자신이나 소비자에게 부담을 주어서는 안됩니다. Null은 존재하지 않는 것이 아니라 명시 적으로 선택해야하는 것이어야합니다.
는 다음과 같이 표시됩니다

class Person 
{ 
    public string FirstName; // Not null 
    public string? MiddleName; // May be null 
    public string LastName; // Not null 
} 

이 클래스는 이제 모두가 제 1 및 성과 이름,하지만 어떤 사람들은 중간 이름이있다하는 의도를 표현 할 수 있습니다.

따라서이 언어 기능을 "nullable reference types"이라고 부르는 이유가 있습니다. 언어에 추가되는 이유입니다. null가 아닌 것들은 적어도 구문 적으로 이미 있습니다.

이 여전히 프로토 타입이며, 언어 (여부를) 끝낼 수 있습니다.
"The C# Nullable Reference Types Preview"에 더 많은 것을보십시오.