2011-02-13 4 views
4

인스턴스 유형 : 새로운 사용시?

다음과 같이 f # 클래스를 매핑하는 형식이 있습니다.

type MyClass = 
    val myval: integer 
    new() = { 
     myval = 0; 
    } 
    member self.MyVal with 
     get() = self.myval 

자,이 클래스의 인스턴스를 만들고 싶습니다. 이렇게 할 수 있습니다 :

let myinstance = MyClass() 

또는

let myinstance = new MyClass() 

다른 점은 무엇입니까? 둘 다 할 수 있습니까?

답변

2

IDisposable을 구현하는 유형의 경우 new를 사용하여 인스턴스화해야합니다. 그렇지 않으면 다음 컴파일 경고가 표시됩니다.

으로 IDisposable 인터페이스를 지원하는 객체가 자원이 더있다 생성 된 값

+1

나는 이것이 유일한 단 하나의 차이라고 기대하지 않았다 :) 고마워. – Andry

2

소유 할 수 없습니다 것을 나타 내기 위해서 '종류 (인수)'보다는 '새로운 종류 (인수를)'를 사용하여 작성하는 것이 좋습니다 차. 두 호출은 정확히 동일한 IL 코드를 가진 새로운 객체를 생성합니다.

.method public static void [email protected]() cil managed 
{ 
    .entrypoint 
    // Code size  26 (0x1a) 
    .maxstack 4 
    .locals init ([0] class Program/MyClass myinstance, 
      [1] class Program/MyClass myinstance2) 
    IL_0000: nop 
    IL_0001: newobj  instance void Program/MyClass::.ctor() 
    IL_0006: dup 
    IL_0007: stsfld  class Program/MyClass '<StartupCode$fsharpapp>'.$Program::[email protected] 
    IL_000c: stloc.0 
    IL_000d: newobj  instance void Program/MyClass::.ctor() 
    IL_0012: dup 
    IL_0013: stsfld  class Program/MyClass '<StartupCode$fsharpapp>'.$Program::[email protected] 
    IL_0018: stloc.1 
    IL_0019: ret 
} // end of method $Program::[email protected] 

이진 파일을 디 컴파일하려면 Visual Studio 명령 프롬프트를 열 때 경로에있는 .NET Framework SDK의 ildasm을 사용할 수 있습니다.

ildasm /CAVERBAL /out=fsharp.il fsharpapp.exe 

옵션 CAVERBAL은 이진 Blob이 아닌 사람이 읽을 수있는 형식으로 특성 내용을 인쇄합니다.

+0

감사합니다 Alois ... 죄송합니다 한 질문, 일리노이 Dissassembler 사용하지만 정확한 전체 il 코드를 보려면 트리를 어떻게해야합니까 ??? – Andry

+0

ildasm 파일 -> 덤프에서.그것은 당신이 해독 된 코드에서 원하는 항목의 목록을 제시하고 OK를 누르면 IL 코드를 덤프 할 파일 이름을 묻습니다. – Hakeem

+0

ildasm /out=fsharp.il fsharpapp.exe –

8

기술적으로 차이점은 IDisposable 개체를 만들 때 new을 사용해야하며 nyinyithann은 이미 설명했습니다. 또 다른 차이점은 제네릭 형식 만들 때 형식 인수를 생략 할 수 있다는 것입니다 :이 두 가지에서 제외

// Works and creates Dictionary<int, string> 
let r1 = System.Collections.Generic.Dictionary 10 
r1.Add(10, "A") 

// You get a compiler error when you write this: 
let r2 = new System.Collections.Generic.Dictionary 10 
r2.Add(10, "A") 

을, 기술적 인 차이가 없다 (당신이 작성하거나 new을 생략 할 때 생성 된 IL의 차이는 확실히 없음) .

다음 중 어느 것을 사용해야합니까? 이것은 스타일의 문제입니다. 이것은 F # 코딩 표준에 포함되지 않으므로 선호도에 따라 다릅니다. 이제 나는 그것에 대해 생각하고있다. 아마 나는 매우 일관된 스타일을 가지고 있지 않을 것이다. 인수 (다음 예제 예를 들어 Size 또는 Point로 사용되는 개체를 만들 때, 나는 보통 new를 사용하지 않는

let rnd = new Random() 

: 나는 인스턴스를 만들 때 일반적으로 let를 사용하여 가치를 할당 할 new을 사용하여 생각) :

let frm = new Form(Size = Size(600, 400)) 
let gr = frm.CreateGraphics() 
gr.FillRectangle(Brushes.Red, Rectangle(Point(0, 0), Point(100, 100))) 

아마도, 나는 또한 (하지만 난 너무 일관 이렇게 생각하지 않는다) 더 복잡한 유형 new을 사용하여 선호 간단한 유형 또는 .NET 값 유형을 피하십시오.

+0

경고 메시지가 계속 나타나는 이유는 무엇입니까? 'new'를 생략하고'let' 바인딩 대신'use'를 사용할 때? 그게 '징후'로 충분하지 않아야합니까? – nphx

관련 문제