문제

저는 C#을 배우려는 PHP 웹 프로그래머입니다.

C#에서 변수를 생성할 때 데이터 형식을 지정해야 하는 이유를 알고 싶습니다.

Class classInstance = new Class();

클래스 인스턴스 이전에 데이터 유형을 알아야 하는 이유는 무엇입니까?

도움이 되었습니까?

해결책

다른 사람들이 말했듯이 C#은 정적/강하게 유형입니다. 하지만 나는 당신의 질문을 더 많이 받아 "왜 당신은 원하다 C# 이렇게 정적/강하게 유형 되는가? 역동적 인 언어보다 어떤 장점이 있습니까? "

이를 염두에두고 많은 이유가 있습니다.

  • 안정 코드가 프로덕션과 가까운 곳에 만들기 전에 컴파일러가 특정 종류의 오류가 자동으로 잡히는 경우가 있습니다.
  • 가독성/유지 가능성 이제 코드를 읽는 미래의 개발자에게 코드가 어떻게 작동하는지에 대한 자세한 정보를 제공하고 있습니다. 특정 변수가 특정 종류의 값을 보유하기위한 정보를 추가하고 프로그래머가 해당 변수의 목적이 무엇인지에 대한 추론을 돕는 데 도움이됩니다.

    예를 들어, Microsoft의 스타일 지침은 VB6 프로그래머가 가변 이름을 가진 유형 접두사를 넣지 만 VB.NET 프로그래머가 그렇지 않은 이유 일 것입니다.

  • 성능 이것이 가장 약한 이유이지만 늦은 바인딩/오리 타이핑은 느릴 수 있습니다. 결국, 변수는 특정한 방식으로 구성된 메모리를 의미합니다. 강력한 유형이 없으면 프로그램은 논리적으로 다른 방식으로 구성된 것처럼 물리적으로 구조화 된 메모리를 사용하는 메모리를 사용하면 런타임에 추가 유형 확인 또는 전환을 수행해야합니다.

    궁극적으로 당신은 종종 강력하게 입력 된 언어로 이러한 전환을해야하기 때문에이 점을 포함하는 것을 망설입니다. 강력하게 타이핑 된 언어는 프로그래머로의 전환의 정확한시기와 범위를 남기고, 완료 해야하는 한 추가 작업을 수행하지 않는 것입니다. 또한 프로그래머가보다 유리한 데이터 유형을 강요 할 수 있습니다. 그러나 이것들은 실제로의 속성입니다 프로그램 제작자, 플랫폼보다는.

    좋은 역동적 인 언어가 종종 프로그래머보다 더 나은 선택을 할 것이라는 점을 제외하고는 그 자체가 요점을 생략 해야하는 약한 이유입니다. 이는 역동적 인 언어가 많은 프로그래머가 더 빠른 프로그램을 작성하는 데 도움이 될 수 있음을 의미합니다. 아직도 좋은 프로그래머, 강력한 언어에는 다음과 같습니다 잠재적인 더 빨리.

  • 더 나은 개발 도구 IDE가 어떤 유형 A 변수가 예상되는지 알고 있다면 변수가 할 수있는 일에 대한 추가 도움을 줄 수 있습니다. IDE가 귀하를위한 유형을 유추 해야하는 경우 IDE가 수행하기가 훨씬 어렵습니다. 그리고 IDE에서 API의 Minutia에 더 많은 도움을 받으면 개발자로서 당신은 더 크고 풍부한 API를 주위로 데려 갈 수 있고 더 빨리 도착할 수 있습니다.

아니면 왜 같은 줄의 동일한 변수에 대해 클래스 이름을 두 번 지정 해야하는지 궁금했을 것입니다. 대답은 두 가지입니다.

  1. 종종 당신은 그렇지 않습니다. C# 3.0 이상에서 var 많은 경우 유형 이름 대신 키워드입니다. 이 방법으로 생성 된 변수는 여전히 정적으로 입력되었지만 이제 유형이 있습니다. 추론 컴파일러에 의해 당신을 위해.
  2. 상속과 인터페이스 덕분에 때로는 왼쪽의 유형이 오른쪽의 유형과 일치하지 않습니다.

다른 팁

그것은 단순히 언어가 설계된 방식입니다.C#은 C 스타일 언어이며 왼쪽에 형식이 있는 패턴을 따릅니다.

C# 3.0 이상에서는 로컬 형식 추론을 사용하여 많은 경우 이 문제를 해결할 수 있습니다.

var variable = new SomeClass();

그러나 동시에 LHS에서 여전히 유형을 선언하고 있다고 주장할 수도 있습니다.컴파일러가 당신을 위해 그것을 선택하기를 원합니다.

편집하다

사용자의 원래 질문과 관련하여 이 내용을 읽어 보십시오.

변수 이름 앞에 [클래스 이름]이 필요한 이유는 무엇입니까?

나는 이 스레드의 다른 몇 가지 답변에 대해 언급하고 싶었습니다.많은 사람들이 "C#은 정적인 유형입니다"라고 대답합니다.이 진술은 사실이지만(C#은 정적으로 형식화됨) 질문과 거의 전혀 관련이 없습니다.정적 유형 지정에서는 유형 이름이 변수 이름 왼쪽에 있을 필요가 없습니다.물론 도움이 될 수 있지만 이는 정적 유형 언어의 필수 기능이 아니라 언어 디자이너의 선택입니다.

이는 F#과 같은 다른 정적으로 형식화된 언어를 고려하여 쉽게 증명할 수 있습니다.F#의 형식은 변수 이름 오른쪽에 표시되며 완전히 생략될 수 있는 경우가 많습니다.또한 몇 가지 반대 사례도 있습니다.예를 들어 PowerShell은 매우 동적이며 포함된 경우 모든 유형을 왼쪽에 배치합니다.

주된 이유 중 하나는 할당의 왼쪽 유형이 왼쪽의 상위 유형 (또는 해당 유형에서 구현 된 인터페이스)이면 다른 유형을 지정할 수 있기 때문입니다.

예를 들어 다음 유형이 주어지면

class Foo { }
class Bar : Foo { }
interface IBaz { }
class Baz : IBaz { }

C#은 다음을 수행 할 수 있습니다.

Foo f = new Bar();
IBaz b = new Baz();

예, 대부분의 경우 컴파일러입니다 ~할 수 있었다 과제에서 변수의 유형을 유추하십시오 ( var 키워드) 그러나 위에서 보여준 이유는 아닙니다.

편집하다: 순서대로 -C# ~이다 강력하게 중요한 차이점 (이 논의에 관한 한)은 실제로 그것이 또한 정적으로 유형 언어. 다시 말해 C# 컴파일러는 컴파일 시간에 정적 유형 확인을 수행합니다.

C#은 a입니다 정적으로 유형, 강하게 유형 C 또는 C ++와 같은 언어. 이 언어에서 모든 변수는 특정 유형으로 선언되어야합니다.

궁극적으로 Anders Hejlsberg가 그렇게 말했기 때문에 ...

첫 번째 [클래스 이름]이 두 번째와 같은 상황이 많기 때문에 [클래스 이름]이 필요합니다.

 IMyCoolInterface obj = new MyInterfaceImplementer();
 MyBaseType obj2 = new MySubTypeOfBaseType();

유형을 설명하지 않으려면 'var'라는 단어를 사용할 수도 있습니다.

데이터 유형을 알아야하는 이유는 무엇입니까? ~ 전에 수업 인스턴스?

당신은 그렇지 않습니다! 오른쪽에서 왼쪽으로 읽으십시오. 변수를 생성 한 다음 유형의 안전 변수에 저장하여 나중에 사용하기 위해 변수가 어떤 유형인지 알 수 있습니다.

다음 스 니펫을 고려하십시오. 런타임까지 오류를받지 못하면 디버깅하는 것이 악몽 일 것입니다.

 void FunctionCalledVeryUnfrequently()
 {
   ClassA a = new ClassA();
   ClassB b = new ClassB();
   ClassA a2 = new ClassB(); //COMPILER ERROR(thank god)

   //100 lines of code

   DoStuffWithA(a);
   DoStuffWithA(b);      //COMPILER ERROR(thank god)
   DoStuffWithA(a2);
 }

당신이 생각할 때 당신은 교체 할 수 있습니다 새로운 클래스 () 숫자 나 문자열이 있으면 구문이 훨씬 더 의미가 있습니다. 다음 예는 약간 장점 일 수 있지만 왜 그 방식대로 설계된 이유를 이해하는 데 도움이 될 수 있습니다.

   string s = "abc";
   string s2 = new string(new char[]{'a', 'b', 'c'});
   //Does exactly the same thing

   DoStuffWithAString("abc");
   DoStuffWithAString(new string(new char[]{'a', 'b', 'c'}));
   //Does exactly the same thing

다른 사람들이 지적했듯이 C#은 강력하고 정적으로 유용한 언어입니다.

당신이 만들고자하는 유형이 무엇인지 앞에서 언급함으로써 불법 가치를 할당하려고 할 때 컴파일 타임 경고를 받게됩니다. 메소드에서 수용 할 수있는 매개 변수 유형을 선발함으로써, 실수로 말도 안되는 메소드를 기대하지 않는 메소드로 전달할 때 동일한 컴파일 타임 경고를받습니다. 그것은 당신을 대신하여 일부 편집증의 오버 헤드를 제거합니다.

마지막으로, C# (그리고 다른 많은 언어)은 PHP가하는 사고 방식이 "이해가되지 않더라도 무엇이든 전환하는 것"과 같은 말도 안되는 일이 아닙니다. 도움이됩니다.

C#은 강력하게 입력 한 언어이기 때문입니다

C#은 C ++ 또는 Java와 같은 강력한 언어입니다. 따라서 변수의 유형을 알아야합니다. VAR 키워드를 통해 C# 3.0에서 약간 퍼지 할 수 있습니다. 이를 통해 컴파일러가 유형을 유추 할 수 있습니다.

이것이 강력하게 타이핑 된 언어와 약한 유형 언어의 차이점입니다. C# (및 C, C ++, Java, 가장 강력한 언어)은 강력하게 입력하므로 변수 유형을 선언해야합니다.

데이터를 보유하기 위해 변수를 정의 할 때 해당 변수가 보유 할 데이터 유형을 지정해야합니다. 그런 다음 컴파일러는 데이터로 수행하는 작업이 적합한 지 확인합니다. 즉, 규칙을 따릅니다. 예를 들어 숫자로 저장 텍스트를 할 수 없습니다. 컴파일러는 허용하지 않습니다.

int a = "fred"; // Not allowed. Cannot implicitly convert 'string' to 'int' 

변수 a는 int 유형이며 텍스트 문자열 인 "fred"값을 할당합니다.이 텍스트 문자열은 규칙을 중단합니다. 컴파일러는이 문자열을 어떠한 종류의 변환도 할 수 없습니다.

C# 3.0에서는 'var'키워드를 사용할 수 있습니다. 이는 정적 유형의 추론을 사용하여 변수 유형이 컴파일 타임에 무엇인지 알아냅니다.

var foo = new ClassName();

변수 'foo'는 그때부터 'classname'유형입니다.

언급되지 않은 것은 C#이 CLS (공통 언어 사양) 준수 언어라는 것입니다. 이것은 .NET 언어가 다른 .NET 언어와 상호 교류하기 위해 준수 해야하는 일련의 규칙입니다.

따라서 C#은 이러한 규칙을 유지하고 있습니다. 인용합니다 이 MSDN 기사:

CLS는 개발자가 다양한 언어로 사용할 수있는 일련의 기능을 정의하여 언어 상호 운용성을 향상시키고 보장하는 데 도움이됩니다. CLS는 또한 CLS 규정 준수 요구 사항을 설정합니다. 이를 통해 관리되는 코드가 CLS에 부합하는지 여부와 주어진 도구가 CLS 기능을 사용하는 관리 코드의 개발을 어느 정도까지 지원하는지 결정하는 데 도움이됩니다.

구성 요소가 API에서 다른 코드 (파생 클래스 포함)에 노출되는 CLS 기능 만 사용하는 경우 CLS를 지원하는 모든 프로그래밍 언어에서 구성 요소가 액세스 할 수 있도록 보장됩니다. CLS 규칙을 준수하고 CLS에 포함 된 기능 만 사용하는 구성 요소는 CLS 호환 구성 요소라고합니다.

CLS의 일부는 CTS입니다 공통 유형 시스템.

그것이 당신에게 충분한 약어가 아니라면 CLI, Ilasm/MSIL, CLR, BCL, FCL, CLI와 같은 .NET에 톤이 더 있습니다.

정적 타이핑을 통해 컴파일러는 더 나은 최적화를 만들고 특정 단계를 건너 뛸 수 있습니다. 예를 들어, 인수에 의해서만 다른 이름을 가진 여러 메소드 나 연산자가있는 곳에서 과부하를 취하십시오. 동적 언어를 사용하면 런타임은 각 버전을 등급을 매기려면 가장 잘 일치하는지 결정해야합니다. 이와 같은 정적 언어를 사용하면 최종 코드는 단순히 적절한 오버로드를 직접 가리 킵니다.

정적 타이핑은 또한 코드 유지 보수 및 리팩토링에 도움이됩니다. 내가 가장 좋아하는 예는 많은 고급 IDE의 이름 바꾸기 기능입니다. 정적 타이핑 덕분에 IDE는 코드에서 식별자의 모든 발생을 확실하게 찾을 수 있으며 관련없는 식별자에게 동일한 이름을 그대로 유지할 수 있습니다.

아직 언급되었는지 여부는 눈치 채지 못했지만 C# 4.0은 dynamic 예어. 필요하지 않을 때는 피하고 싶다고 확신합니다.

c#이 변수를 만들 때 데이터 유형을 지정 해야하는 이유

클래스 인스턴스 전에 데이터 유형을 알아야하는 이유는 무엇입니까?

대부분의 답변이 언급하지 않은 것은 C#이라는 사실입니다. 원래 의미 있고 "관리", "안전한"언어로 설계되었으며 이러한 목표는 정적 / 컴파일 시간 검증을 통해 도달합니다. 가변 데이터 유형을 명시 적으로 알면이 문제가 훨씬 쉽게 해결할 수 있습니다. 즉, 실행을 허용하지 않고 가능한 오류 / 바람직하지 않은 동작에 대해 여러 자동 평가 (JIT가 아닌 C# 컴파일러)를 만들 수 있음을 의미합니다.

부작용으로서의 검증 가능성은 또한 더 나은 가독성, 개발 도구, 안정성 등을 제공합니다. 자동화 된 알고리즘이 실제로 실행될 때 코드가 수행 할 작업을 더 잘 이해할 수 있으므로 :)

정적으로 입력 한 것은 컴파일러가 런타임이 아닌 컴파일 시간에 일종의 검사를 수행 할 수 있음을 의미합니다. 모든 변수는 정적 유형의 특정 또는 강력한 유형입니다. C#은 강력하게 타이핑됩니다.

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