문제

좋아, 나는 당신이 무엇을 생각하는지 알고 있습니다. "사람들이 왜 사용하기를 원하지 않는 방법을 작성합니까?" 권리?

요컨대, 나는 XML에 직렬화되어야하는 수업이 있습니다. In order for the XmlSerializer 마법을하려면 클래스에는 기본적으로 빈 생성자가 있어야합니다.

public class MyClass
{
  public MyClass()
  {
    // required for xml serialization
  }
}

그래서 나는 그것을 가져야하지만 사람들이 사용 그것은 그렇게 메소드를 "사용하지 않는"것으로 표시하는 데 사용할 수있는 속성이 있습니까?

나는 그것을 사용하려고 생각하고 있었다 쓸모없는 속성 (이것은 빌드를 멈출 수 있기 때문에)이지만 "잘못된"것처럼 보이며, 다른 방법이 있습니까, 아니면 총알을 물어야합니까? :)

업데이트

좋아, 나는 마음의 마음 속에 있다고 생각하기 때문에 Keith의 대답을 받아 들였다. 나는 완전히 동의한다. 이것이 내가 처음에 질문을 한 이유입니다. 나는 쓸모없는 기인하다.

하지만...

거기 ~이다 여전히 문제가되는데, 우리가 Intellisense에서 통보를받는 동안 이상적으로는 빌드를 깨고 싶습니다.이 작업을 수행 할 방법이 있습니까? 아마도 사용자 정의 속성을 만들 수 있습니까?

더 집중된 질문이 만들어졌습니다 여기.

도움이 되었습니까?

해결책

수업이 있다면 [Serialisable] (즉, 필요에 따라 장소 주위에 복사 할 수 있습니다.) 파라미터가없는 생성자는 사로화하기 위해 필요합니다.

나는 당신이 당신의 코드의 액세스를 당신의 속성에 대한 기본값을 매개 변수화 된 생성자에게 강제로 강제로 강요하고 싶다고 생각합니다.

기본적으로 당신은 그것이 괜찮다고 말하고 있습니다 XmlSerializer 사본을 만들고 속성을 설정하려면 자신의 코드를 원하지 않습니다.

어느 정도까지 나는 이것이 과다 디자인이라고 생각합니다.

초기화가 필요한 속성을 자세히 설명하는 XML 주석을 추가하십시오.

사용하지 마십시오 [Obsolete], 그렇지 않기 때문에. 진정으로 더 이상 사용되지 않은 방법으로 예약하십시오.

다른 팁

당신이 사용할 수있는:

[System.componentModel.editorBrowsable(System.componentmodel.editorbrowsablestate.never)]

지적으로 나타나지 않도록. 소비자가 여전히 사용하기를 원한다면 가능하지만 발견 할 수는 없습니다.

Keiths는 Over Engineering에 대해 여전히 지적합니다.

나는 제목을 읽고 즉시 "쓸모없는 혐오"를 생각했습니다. 어때

    /// <summary>
    /// do not use
    /// </summary>
    /// <param name="item">don't pass it anything -- you shouldn't use it.</param>
    /// <returns>nothing - you shouldn't use it</returns>
    public bool Include(T item) { 
    ....

나는 실제로 사용을 옹호하는 모든 사람들에게 동의하지 않을 것입니다. ObsoleteAttribute MSDN 문서에 따르면 다음과 같이 말합니다.

쓸모없는 것으로 요소를 표시하면 사용자에게 미래의 제품 버전에서 요소가 제거 될 것임을 알려줍니다.

XML 직렬화를위한 일반 생성자를 응용 프로그램에서 제거해서는 안되므로 도로 아래의 유지 보수 개발자가 XML 직렬화의 작동 방식에 익숙하지 않은 경우에만 적용하지 않습니다.

나는 실제로 사용하고있다 키이스 생성자가 XML 문서에서 직렬화에 사용되어 IntelliSense에 나타나는 방법입니다.

당신은 당신 자신을 만들 수 있습니다 Attribute 파생 수업은 말합니다 NonCallableAttribute 방법을 적합한 다음 빌드/CI 코드 분석 작업에 추가하여 코드가 해당 메소드를 사용하는지 모니터링하기 위해 확인하십시오.

제 생각에는 개발자 가이 방법을 사용하지 않도록 강요 할 수는 없지만 누군가가 가능한 한 빨리 규칙을 어겼을 때를 감지하고 수정할 수 있습니다.

와우, 그 문제도 저를 괴롭 히고 있습니다.

또한 nhibernate 용 기본 생성자가 필요하지만 클래스가 생성자 코드를 통과하도록 C# 3.0 객체 초기화기를 사용하지 않도록 사람들이 강제로 강요하고 싶습니다.

throw new ISaidDoNotUseException();

직렬화 가능한 객체를 도메인 객체에서 분리하십시오.

당신이 찾고있는 것은 ObsoleteAttribute 수업:

using System;

public sealed class App {
   static void Main() {      
      // The line below causes the compiler to issue a warning:
      // 'App.SomeDeprecatedMethod()' is obsolete: 'Do not call this method.'
      SomeDeprecatedMethod();
   }

   // The method below is marked with the ObsoleteAttribute. 
   // Any code that attempts to call this method will get a warning.
   [Obsolete("Do not call this method.")]
   private static void SomeDeprecatedMethod() { }
}

ObsoleteAttribute 아마도 당신의 상황에서 작동 할 것입니다. 해당 방법이 사용되면 빌드가 파손될 수도 있습니다.

쓸모없는 경고는 컴파일 시간에 발생하고, 직렬화에 필요한 반사가 런타임에 발생하기 때문에, 해당 방법을 사용하면 직렬화가 깨지지 않지만 개발자에게 방법이 사용되지 않는다고 경고합니다.

나는 사용하고있다 ObsoleteAttribute.

그러나 물론 몇 가지 의견을 가질 수 있습니다.

그리고 마지막으로 할 수 있다면 완전히 제거하십시오 (오래된 것과의 호환성을 유지할 필요는 없습니다). 그것이 가장 좋은 방법입니다.

네가 있습니다.

나는 그것에 대해이 블로그 포스트를 썼습니다 디자이너와 함께 일합니다.

그리고 여기 코드가 있습니다.


public class MyClass
{
  [Obsolete("reason", true)]
  public MyClass()
  {
    // required for xml serialization
  }
}

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top