2010-05-28 5 views
11

사용하지 않는 속성은 런타임에만 확인됩니다.더 이상 사용되지 않는 속성은 컴파일시에만 검사됩니까?

두 개의 어셈블리가 있다고 가정하십시오. 어셈블리 A는 어셈블리 B에서 메서드를 사용합니다. 어셈블리 B에서 메서드를 사용하면 어셈블리 B를 컴파일 할 때 컴파일 시간 오류가 발생합니다.

이전 어셈블리가 계속 진행되는지 여부는 문제가되지 않습니다 새 어셈블리 B와 함께 작동하는지 여부 감사합니다

답변

13

그것은 당신이 무엇을하고 있는지에 따라 달라집니다 (어셈블리 버전을 제공하는 것은 동일하게 유지). [Obsolete] 속성은 컴파일시에 사용하기 위해 이 주로이지만, 런타임의 일부 부분은 다른 동작을 나타냅니다 (아래 참조). 은 다시 빌드되지 않은 기존 코드에서도 문제를 일으킬 수 있으므로 NO, [Obsolete]은 컴파일 할 때만 검사하지 않는 것이 좋습니다.

+0

자세한 답변을 주셔서 감사합니다. Marc. – mkus

+0

이 문제가 발생했습니다. 열거 형에 웹 서비스에서 [Obsolete]라는 항목을 표시했습니다. 서비스를 사용하는 클라이언트는 런타임시 해당 enum 항목을 더 이상 수신하지 않습니다. 그러나 웹 참조는 여전히 그들을 포함 할 것입니다. 이것은 나에게 직렬화에있는 버그 또는 기껏해야 열악한 설계 결정 인 것처럼 보입니다. 이 플래그의 런타임 의미를 부여하면 내 생각에 완전히 그 목적을 무효화합니다. – LOAS

6

Obsolete로 표시된 다른 어셈블리의 메서드를 사용하는 어셈블리를 빌드하면 컴파일 타임 경고가 발생합니다 ('경고를 오류로 표시'하지 않은 경우).

참조 된 어셈블리에 남아있는 동안이 방법을 사용할 수 없습니다. Obsolete 속성은 라이브러리 개발자가 라이브러리를 사용하는 사람들이 필요한 것을 얻기 위해 다른 방법을 사용해야한다고 알리는 방법으로 사용됩니다.

가 귀하의 질문에 대답하기 위해, 예, 이전 조립체 (A)가 새로운 조립 B. 작업을 계속

+0

+1 그것에 나를 이길 -

using System; using System.Xml.Serialization; public class Data { public int Foo { get; set; } [Obsolete] public int Bar {get;set;} static void Main() { var data = new Data { Foo = 1, Bar = 2 }; new XmlSerializer(data.GetType()).Serialize(Console.Out, data); } } 

(컴파일러의 일부 XmlSerializer 너무 런타임 인) :

예를 들어, 아래 코드는 Foo하지만 Bar 작성합니다. –

+2

모든 경우에 보장되는 것은 아닙니다. 이유에 대한 내 답을보십시오 ... –

+0

'[Obsolete ("nitpicking", true)]'_display 경고가 errors_ disabled 인 경우에도 직접 참조하면 컴파일시 오류가 발생합니다. – mbx

관련 문제