C #에서 Java의 final과 동등한 것은 무엇입니까?
final
C #에서 Java와 동등한 것은 무엇입니까 ?
final
키워드는 자바에서 여러 가지 용도가있다. 사용되는 컨텍스트에 따라 C # 의 sealed
및 readonly
키워드에 모두 해당합니다 .
클래스
서브 클래 싱을 방지하려면 (정의 된 클래스의 상속) :
자바
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
키워드 의 효과 const
는 readonly
표현식이 compile-time이 아닌 런타임시 평가 되므로 임의의 표현식을 허용 한다는 점에서 키워드 의 효과 와 다릅니다 .
상황에 따라 다릅니다.
- A의
final
클래스 또는 메소드는 C # 1 당량이다sealed
. - A에 대한
final
필드, C # 1 당량이다readonly
. - A에 대한
final
로컬 변수 또는 매개 변수에있어서, 직접 C # 1 당량 없다.
여기에 모두 빠진 것은 최종 멤버 변수에 대한 명확한 할당을 보장하는 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에 해당하지 않습니다.
C # 상수는 컴파일 시간 상수의 const 키워드 또는 런타임 상수의 readonly 키워드를 사용하여 선언됩니다. 상수의 의미는 C # 및 Java 언어에서 동일합니다.
봉인
참고 URL : https://stackoverflow.com/questions/1327544/what-is-the-equivalent-of-javas-final-in-c
'development' 카테고리의 다른 글
screenX / Y, clientX / Y 및 pageX / Y의 차이점은 무엇입니까? (0) | 2020.02.10 |
---|---|
HTML 테이블에서 자동 줄 바꿈 (0) | 2020.02.10 |
jQuery에서 PUT / DELETE 요청을 보내는 방법은 무엇입니까? (0) | 2020.02.10 |
{get; (0) | 2020.02.10 |
Twitter 부트 스트랩 모달 창이 닫히지 못하게하십시오. (0) | 2020.02.10 |