문제

Resharper는 정적으로 만들 수있는 ASP.NET 페이지에 따라 여러 기능을 지적하는 것을 좋아합니다. 내가 그것들을 정적으로 만들면 도움이됩니까? 그것들을 정적으로 만들고 유틸리티 클래스로 옮겨야합니까?

도움이 되었습니까?

해결책

정적 메소드 대 인스턴스 방법
10.2.5 정적 및 인스턴스 멤버 C# 언어 사양 중 차이를 설명합니다. 일반적으로 정적 방법은 인스턴스 방법에 비해 매우 작은 성능 향상을 제공 할 수 있지만 다소 극단적 인 상황에서만 가능합니다 ( 이 답변 그것에 대한 자세한 내용은).

FXCOP 또는 코드 분석에서 CA1822 규칙 :

[멤버를 정적으로 표시] 후, 컴파일러는 이들 멤버에게 비 초반의 콜 사이트를 방출하여 각 통화에 대한 런타임에 대한 런타임을 확인하지 못하면 현재 객체 포인터가 널이 없음을 보장합니다. 이로 인해 측정 가능한 성능 이득이 발생할 수 있습니다. 성능에 민감한 코드의 경우 경우 경우에도 현재 객체 인스턴스에 액세스하지 못하면 정확성 문제가 나타납니다. "

유틸리티 클래스
디자인에서 의미가 없다면 유틸리티 클래스로 옮기지 않아야합니다. 정적 메소드가 특정 유형과 관련이있는 경우 ToRadians(double degrees) 메소드는 각도를 나타내는 클래스와 관련이 있으며, 해당 메소드가 해당 유형의 정적 구성원으로 존재하는 것이 합리적입니다 (참고, 이것은 데모 목적으로 복잡한 예입니다).

다른 팁

성능, 네임 스페이스 오염 등은 모두 제 생각에 부차적입니다. 논리적 인 것이 무엇인지 스스로에게 물어보십시오. 메소드가 유형의 인스턴스에서 논리적으로 작동합니까, 아니면 유형 자체와 관련이 있습니까? 후자라면 정적 방법으로 만드십시오. 제어하에 있지 않은 유형과 관련이있는 경우 유틸리티 클래스로만 이동하십시오.

때로는 인스턴스에서 논리적으로 행동하지만 인스턴스의 상태를 사용하지 않는 방법이 있습니다. 아직. 예를 들어, 파일 시스템을 구축하고 디렉토리의 개념을 얻었지만 아직 구현하지 않은 경우 파일 시스템 객체의 종류를 반환하는 속성을 작성할 수 있으며 항상 단지 가능합니다. "파일" - 그러나 인스턴스와 논리적으로 관련되어 있으므로 인스턴스 방법이어야합니다. 이는 메소드를 가상으로 만들려면 중요합니다. 특정 구현에는 상태가 필요하지 않을 수 있지만 파생 클래스가 필요할 수 있습니다. (예를 들어, 컬렉션에 읽기 전용인지 아닌지를 묻습니다. 아직 해당 컬렉션의 읽기 전용 형식을 구현하지는 않았지만 유형이 아닌 컬렉션 자체의 속성입니다.)

메소드를 표시합니다 static 클래스 내에서 인스턴스 멤버를 사용하지 않는다는 것이 분명합니다. 이는 코드를 훑어 볼 때 알 수 있습니다.

서로 밀접하게 관련되어 있고 개념적으로 관련된 다른 클래스가 공유하지 않는 한 반드시 다른 클래스로 옮길 필요는 없습니다.

나는 당신의 경우에 이것이 일어나지 않는다고 확신하지만, 나는 일부 코드에서 본 "나쁜 냄새"를 사용하여 많은 정적 방법을 사용하여 고통을 겪어야했습니다.

불행히도, 그들은 특정 응용 프로그램 상태를 가정하는 정적 방법이었습니다. (왜 확실히, 우리는 응용 프로그램 당 하나의 사용자 만있을 것입니다! 왜 사용자 클래스에 정적 변수에서 그것을 추적하지 않습니까?) 글로벌 변수에 액세스하는 영광스러운 방법이었습니다. 그들은 또한 정적 생성자 (!)를 가지고 있었는데, 이것은 거의 항상 나쁜 생각입니다. (몇 가지 합리적인 예외가 있다는 것을 알고 있습니다).

그러나 정적 방법은 실제로 객체 인스턴스의 상태에 의존하지 않는 도메인-로그를 고려할 때 매우 유용합니다. 그들은 당신의 코드를 훨씬 더 읽기 쉽게 만들 수 있습니다.

올바른 장소에 놓으십시오. 정적 방법이 다른 객체의 내부 상태를 침범 적으로 조작하고 있습니까? 그들의 행동이 대신 해당 수업 중 하나에 속한다는 좋은 경우가 될 수 있습니까? 우려 사항을 제대로 분리하지 않으면 나중에 두통이 발생할 수 있습니다.

흥미로운 읽기입니다.

http://thecuttingledge.com/?p=57

Resharper는 실제로 방법을 정적으로 만들 것을 제안하지 않습니다. 서명에 표시되는 수업 중 하나가 아니라 해당 수업에 왜 그 방법이 있는지 스스로에게 물어봐야합니다 ...

그러나 다음은 재 조수 문서화가 말한 내용입니다.http://confluence.jetbrains.net/display/resharper/member+can+ made+made+static

@jason true 's에 추가하기 위해 대답, 메소드에 '정적'을 넣는 것만으로도 메소드가 '순수'임을 보장하지는 않는다는 것을 인식하는 것이 중요합니다. 그것은 선언 된 클래스와 관련하여 무국적이지만, 상태가있는 다른 '정적'객체 (응용 프로그램 구성 등)에 잘 액세스 할 수 있습니다. 이것은 항상 나쁜 것이 아니라 그 이유 중 하나 일 수 있습니다. 나는 개인적으로 내가 할 수있는 정적 방법을 선호하는 경향이 있다면, 그들이 순수하다면, 당신은 주변 상태에 대해 걱정할 필요없이 그들에 대해 격리하여 테스트하고 이유를 테스트 할 수 있다는 것입니다.

주어진 시나리오에서 가장 읽기 쉽고 직관적 인 일을해야합니다.

성능 논증은 가장 극단적 인 상황을 제외하고는 실제로 일어나고있는 유일한 주장은 하나의 추가 매개 변수입니다.this)는 예를 들어 스택에 밀려 나고 있습니다.

클래스 내 복잡한 논리의 경우, 인스턴스 입력이 메소드 서명에 명확하게 정의되고 인스턴스 측면 효과가 발생할 수없는 분리 된 논리를 만드는 데 유용한 개인 정적 메소드를 발견했습니다. 모든 출력은 반환 값 또는 OUT/Ref 매개 변수를 통해 이루어져야합니다. 복잡한 논리를 분해합니다 부작용이없는 코드 블록 코드의 가독성과 개발 팀의 신뢰를 향상시킬 수 있습니다.

반면에 그것은 유틸리티 방법의 확산에 의해 오염 된 계급으로 이어질 수 있습니다. 평소와 같이, 논리적 명명, 문서화 및 팀 코딩 규칙의 일관된 적용으로이를 완화 할 수 있습니다.

Resharper는 논리를 확인하지 않습니다. 메소드가 인스턴스 멤버를 사용하는지 여부 만 확인합니다. 메소드가 비공개이고 인스턴스 메소드에 의해서만 호출되는 경우, 이것은 인스턴스 메소드를 허용하는 부호입니다.

함수가 여러 페이지에서 공유되면 기본 페이지 클래스에 포함시킨 다음 해당 기능을 사용하여 모든 ASP.NET 페이지에 상속 될 수 있습니다 (및 함수는 여전히 정적 일 수 있음).

메소드 정적을 만들면 해당 클래스의 인스턴스를 먼저 만들지 않고 클래스 외부에서 메소드를 호출 할 수 있습니다. 이것은 타사 공급 업체 객체 또는 애드온으로 작업 할 때 도움이됩니다. Con.writeline ()을 호출하기 전에 콘솔 객체 "Con"을 먼저 만들어야한다고 상상해보십시오.

네임 스페이스 오염을 통제하는 데 도움이됩니다.

단지 내 Tuppence : 유틸리티 클래스에 공유 된 모든 정적 메소드를 추가하면 추가 할 수 있습니다.

using static className; 

사용 명령문에 코드를 더 빠르게 입력하고 읽기 쉽게 만듭니다. 예를 들어, 나는 상속 된 일부 코드에서 "글로벌 변수"라고 불리는 많은 수가 있습니다. 인스턴스 클래스 인 클래스에서 글로벌 변수를 만드는 대신 글로벌 클래스의 정적 특성으로 설정했습니다. 그것은 지저분한 일을하고, 정적 네임 스페이스가 이미 참조되어 있기 때문에 속성을 이름으로 언급 할 수 있습니다.

이것이 좋은 연습인지 아닌지 모르겠습니다. 나는 C# 4/5에 대해 배울 것이 많고 Reselyn 팁이 저를 안내하려고 노력하고 있습니다.

조이

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