development

C #에서 Java의 final과 동등한 것은 무엇입니까?

big-blog 2020. 2. 10. 22:17
반응형

C #에서 Java의 final과 동등한 것은 무엇입니까?


finalC #에서 Java와 동등한 것은 무엇입니까 ?


final키워드는 자바에서 여러 가지 용도가있다. 사용되는 컨텍스트에 따라 C # sealedreadonly키워드에 모두 해당합니다 .

클래스

서브 클래 싱을 방지하려면 (정의 된 클래스의 상속) :

자바

public final class MyFinalClass {...}

씨#

public sealed class MyFinalClass {...}

행동 양식

virtual메소드의 오버라이드를 방지하십시오 .

자바

public class MyClass
{
    public final void myFinalMethod() {...}
}

씨#

public class MyClass : MyBaseClass
{
    public sealed override void MyFinalMethod() {...}
}

Joachim Sauer가 지적한 것처럼, 두 언어의 주목할만한 차이점은 Java는 기본적으로 모든 비 정적 메소드를으로 virtual표시하고 C #은을 표시 한다는 sealed입니다. 따라서 기본 클래스에 sealed명시 적으로 표시된 메서드의 재정의를 더 이상 중지하지 않으려면 C # 에서 키워드 만 사용해야합니다 virtual.

변수

변수를 한 번만 할당하려면 :

자바

public final double pi = 3.14; // essentially a constant

씨#

public readonly double pi = 3.14; // essentially a constant

참고로, readonly키워드 의 효과 constreadonly표현식이 compile-time이 아닌 런타임시 평가 되므로 임의의 표현식을 허용 한다는 점에서 키워드 의 효과 와 다릅니다 .


상황에 따라 다릅니다.


여기에 모두 빠진 것은 최종 멤버 변수에 대한 명확한 할당을 보장하는 Java의 보증입니다.

최종 멤버 변수가 V 인 클래스 C의 경우 C의 모든 생성자를 통한 가능한 모든 실행 경로는 V를 정확히 한 번만 지정해야합니다. V를 지정하지 않거나 V를 두 번 이상 지정하지 않으면 오류가 발생합니다.

C #의 readonly 키워드는 그러한 보장을하지 않습니다. 컴파일러는 readonly 멤버를 할당하지 않은 채로 두거나 생성자 내에서 여러 번 할당하도록 허용하는 것 이상으로 행복합니다.

따라서 final 및 readonly (적어도 멤버 변수와 관련하여)는 동등하지 않습니다. final은 훨씬 엄격합니다.


언급 된 바와 같이, sealed등가 인 final방법 및 클래스는.

나머지는 복잡합니다.

  • 들어 static final필드, static readonly가능한 가장 가까운 것입니다. 정적 생성자에서 정적 필드를 초기화 할 수 있습니다. 이는 Java의 정적 초기화 기와 상당히 유사합니다. 이는 상수 (프리미티브 및 불변 객체)와 변경 가능한 객체에 대한 상수 참조 모두에 적용됩니다.

    const수정은 상수 상당히 유사하지만 정적 생성자에서 그들을 설정할 수 없습니다.

  • 생성자를 떠난 후에는 다시 할당하지 않아야하는 필드에서 readonly사용할 수 있습니다. 그것은 같지 않습니다- final생성자 또는 초기화 프로그램에서도 정확히 하나의 할당이 필요합니다.
  • final내가 아는 지역 변수에 해당 하는 C #은 없습니다 . 왜 누구에게 필요한지 궁금하다면 : if-else, switch-case 등 전에 변수를 선언 할 수 있습니다 . 최종 선언하면 최대 한 번 할당됩니다.

    일반적으로 Java 로컬 변수는 읽기 전에 한 번 이상 지정해야합니다. 값을 읽기 전에 분기가 튀어 나오지 않으면 최종 변수가 정확히 한 번 할당됩니다. 이 모든 것은 컴파일 타임에 확인됩니다. 이를 위해서는 오류에 대한 마진이 적은 잘 동작하는 코드가 필요합니다.

요약하면, C #은에 직접적으로 상응하는 것이 없습니다 final. Java에는 C #의 멋진 기능이 없지만 C #이 동등한 기능을 제공하지 못하는 곳을 Java 프로그래머로 보는 것이 나에게 상쾌합니다.


Java 클래스 final 및 메소드 final-> 봉인되었습니다. Java 멤버 변수 final-> 런타임 상수의 경우 읽기 전용, 컴파일 시간 상수의 const.

지역 변수 final 및 메소드 인수 final에 해당하지 않습니다.


http://en.csharp-online.net/CSharp_FAQ:_What_are_the_differences_between_CSharp_and_Java_constant_declarations

C # 상수는 컴파일 시간 상수의 const 키워드 또는 런타임 상수의 readonly 키워드를 사용하여 선언됩니다. 상수의 의미는 C # 및 Java 언어에서 동일합니다.


봉인

참고 URL : https://stackoverflow.com/questions/1327544/what-is-the-equivalent-of-javas-final-in-c



반응형