2016-10-18 4 views
3

일부 오래된 C# 코드를 유지 관리하고 구조를 너무 많이 변경할 수 없습니다. 나는 기존의 컴파일러 경고를 안전한 방법으로 줄이려고했다. 특정 함수는 다음과 같은 경고 메시지를 표시합니다.C# 함수를 비공개로 설정하거나 final로 선언하거나 선언 형식을 봉쇄

경고 CS0108 '함수 (문자열, 문자열)'는 상속 된 멤버 'xyz.Function (string, string)'을 숨 깁니다. 은폐가 의도 된 경우 new 키워드를 사용하십시오.

저는 상속 된 함수를 숨기는 것이 소프트웨어가 수년 동안 성공적으로 사용되어 왔기 때문에 의도적이라고 가정합니다. (문자열을

경고 CA2222 제조사 '기능을 : 나는

private new void Function(string parm1, string parm2) 
예상대로 경고가 사라

이 함수 선언을 만들기 위해 "새로운"키워드를 추가에 전혀 해 보지 않았다, 그러나 이것은 대신 등장 문자열) '비공개, 최종으로 표시하거나 선언 유형을 봉인하십시오. 이 메소드는 원래 기본 클래스 'BaseClassName'에 정의되어 있습니다.

이 경고를 표시하는 것 외에도 가장 안전한 (즉, 비 행동 변화) 옵션이 무엇인지 알려 드리고자합니다. 나는이 방법을 비공개로 만들어야한다고 생각하지 않는다. (나는 이것을 "대중"이라고 생각한다.) 최종 또는 봉인하는 방법과 올바른 방법이 될 수 있는지 여부는 확실하지 않습니다.

+0

는 원래 경고 클래스의 일부 자세한 내용을 줄 수있는 virtual 키워드를 제거하는 것입니다

public/protected/internal virtual new void Function(string parm1, string parm2) 

하는 경우 (새로운 키워드를 사용하십시오 ...) 그리고 확장하는 클래스? 원래의 의도가 원래 기능을 가상으로 표시하고 확장 기능을 무시로 표시 할 가능성이 높습니다. 그래도 더 자세한 정보가 필요합니다. – rolls

+0

기본 클래스에서 "보호 된"함수 일 수 있습니까? –

+0

이 위의 코드가 숨어있는 기본 클래스의 메서드 정의입니다 : \t 공공 추상 클래스 BaseCodeListPage :베이스 페이지 ... \t \t 보호 무효 AddOnClientClick (문자열 PARM1, 문자열 parm2의) \t \t { \t \t ... \t \t} –

답변

0

리플렉션을 통해이 방법에 액세스 할 수있는 경우가 아니면 "새"키워드를 제거한 다음 이름을 변경합니다 (호출하는 사이트도 변경). 어쨌든이 메서드는 private이므로 위임자가 전달한 경우 (이름이 중요하지 않음) 또는 리플렉션을 사용하여 액세스하는 경우가 아니라면 같은 클래스에서 사용 중이어야합니다.

코드가 올바른 것으로 가정 할 때이 메서드를 호출하는 것은 의도적입니다. 비록 내가 그들을 검토하고 호출 사이트가 잘못된 방법이라고 부르는 어떤 실수가있을 수 있는지를 점검 할지라도.


방법의 가시성을 변경하면 문제가 있으므로 ※ 그렇게하지 마십시오. sealed 클래스를 만드는 것에 관해서는 클래스를 상속하는 제 3 자 코드가있을 수 있으므로 너무 변경하지 마십시오.

※ 게재 빈도의 감소는 멤버를 사용하는 제 3 자 코드가있을 수 있기 때문에 최악입니다. 따라서 큰 변화입니다. 가시성을 높이면 (예 : 개인 메서드를 보호하거나 공용으로 만드는 경우) 형식의 캡슐화가 손상 될 수 있으므로 멤버가 제 3 자 코드를 사용하여 해당 형식의 개체 상태를 엉망으로 만들 수 있으므로주의해야합니다.

+0

고마워, 이것은 알아두면 좋지만, 이름 바꾸기 방법이나 다른 것을 시작하는 것은 아마도 내가 지금 할 수있는 일의 범위를 벗어날 것입니다. 다행히도이 코드를 사용하는 세 번째 응용 프로그램은 없습니다. –

+0

@ JouniJuntunen 지금 경고를 남길 수 있다면, 그것은 당신이나 다른 누군가가 그것을 들여다 볼 수있는 알림이 될 것입니다. 또 다른 한가지는 버전 제어 (다른 솔루션을 브랜치하고 시도 할 수 있음), 자동 테스트 (회귀 테스트를 신속하게 수행 할 수 있음) 등을 살펴보십시오. 코드를 수정할 때 사용자 또는 동료가 가질 수있는 두려움을 완화해야합니다. – Theraot

+0

네, 지금 당장 나가겠습니다. 처음 것에서 코드를 만지는 비용은 물건을 깨뜨리는 것에 대한 두려움이 아닙니다. 우리는 방금이 오래된 코드를 되살려 내고 침입성이없고 복잡하지 않은 몇 가지 기능 향상에 노력했습니다. 기존 코드에 익숙해졌지만 적어도 기존의 경고를 제거하여 작업을 조금 더 깔끔하고 쉽게 할 수있었습니다. –

0

경고를 무시할 수 있습니다 - 잘못 트리거되었습니다. 즉, private new은 다소 코드 냄새가 심하며 더 심각한 문제를 나타낼 수 있습니다.

왜 발생하는지에 대한 설명은 here을 참조하십시오. 누군가가 당신의 new 방법을 무시할 것이라고 걱정합니다.

당신이 중 하나를 방법은 최종 표시되어야합니다, 액세스 한정자를 변경해야하는 경우 또는 유형이 무시되는 방법을 방지하기 위해 밀봉해야한다.

그러나 C#의 메서드는 기본적으로 최종 설정입니다. 메서드를 봉인 된 것으로 표시 (다른 언어에서는 일명) 오버라이드를 방지합니다.

새로운 방법이 있다면 경고에만 적용될 수 :이 솔루션은

+0

감사합니다. 이것은 나와 같은 C# 초보자에게 매우 유용한 정보입니다. –