현재 C# 으로 프로젝트를 하니라고 맨땅에 열심히 헤딩하고 있다.
그러다가 
이런 문장을 봤다. ㅡㅡ'

    public woojja1(string str)
      :this()

woojja1(string str) 은 Constructor 다.
그런데...

:this()는 뭐냐? VB.NET 개발자들에게는 생소하리라 생각된다...
이게 어떤 버젼부터 튀어나왔는지도 모르겠다.(아시는 분 알려주셔요. 1.1 부터인가?)

보니. Default Constructor 를 호출하는 문장이다.

woojja1(string str)보다 woojja1() 을 먼저 실행하게끔 한다.
그렇기 때문에  woojja1() Default Constructor 를 주석처리하게되면 에러가 발생하게된다.
기본적으로 Default Constructor를 호출해야하는데 명시적으로 존재하지 않기 때문에 에러가 발생하는 것이다.

하지만...

reference type 이 아닌 value type 이라면 이야기가 달라진다.
아래 woojja2 가 그 예인데...
일단 아래의 woojja2 structure 의 주석을 풀고 Code를 컴파일 또는 실행하게 되면  structure 는 Parameter 가 없는 Constructor는 명시적으로 포함할 수 없다는 에러메시지가 발생하며 주석있는 대로 컴파일 혹은 실행을 시켜도 에러가 발생하지 않는 것을 알 수 있다.

이런 부분은 단순히 parameter 가 있는 Constructure 내부에서 Default Constructure를 호출할 수있지만
이런 식으로 Default Constructure 를 호출하게 되면 코드 실행순서에 대한 예기치 않은? 에러를 방지할 수 있으리라 생각된다.

VB.NET 에도 포함되어있다면 조금은 편리할 수 있으리라 생각된다. 
(있는데 내가 못찾는 건가? ^^'  그렇다면 알려주셔요... )


아래는 작성해 본 코드입니다.
디버깅을 걸어놓고 코드진행을 눈으로 살펴보시면 이해하기가 훨 나으리라 생각됩니다.
^^ 

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      woojja1 w1 = new woojja1("woojja");
      woojja2 w2 = new woojja2("woojja");
      Console.ReadLine();
    }
  }


  class woojja1
  {
    public woojja1()
    {
      Console.WriteLine("woojja 1 Default");
    }
    public woojja1(string str)
      :this()
    {
      Console.WriteLine("woojja 1");
    }
  }

  struct woojja2
  {
    //public woojja2()
    //{
    //  Console.WriteLine("woojja 2 Default");
    //}
    public woojja2(string str)
      : this()
    {
      Console.WriteLine("woojja 2");
    }
  }
}



행복한 고수되세요...


woojja ))*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
반응형

'.NET > C#' 카테고리의 다른 글

[C#] How do you check if a file is in use?  (0) 2017.07.27
[C#] 단일 Process 실행  (2) 2010.11.08
[C#] C# 은 VB.NET 따라쟁이...  (3) 2009.05.07
[C#] C# 컴파일러 오류  (0) 2009.03.06
[C#] Yield  (0) 2009.03.06

MSDN 내용을 발췌합니다.

확장할수있는개체와여러가지다른표현간에변환하는형식변환기를제공합니다.
네임스페이스: System.ComponentModel
어셈블리: System(system.dll)
구문
Visual Basic(선언)
PublicClassExpandableObjectConverter
     Inherits TypeConverter
 
Visual Basic(사용법)
DiminstanceAs ExpandableObjectConverter
 
C#
publicclassExpandableObjectConverter : TypeConverter
 
C++
publicref classExpandableObjectConverter : public TypeConverter
 
J#
publicclassExpandableObjectConverterextends TypeConverter
 
JScript
publicclassExpandableObjectConverterextends TypeConverter
설명
이클래스에서는개체에대한속성지원이 TypeConverter에서제공되는메서드및속성에추가됩니다. PropertyGrid에서속성형식을확장가능하게지정하려면이 TypeConverterGetPropertiesSupportedGetProperties의표준구현에사용하도록지정합니다.
참고
형식변환기에직접액세스하지말고대신 TypeDescriptor를사용하여해당변환기를호출하십시오. 자세한내용은 TypeConverter 기본클래스의예제를참조하십시오.
형식변환기에대한자세한내용은 TypeConverter 기본클래스및방법: 형식변환기구현을참조하십시오.
참고
이클래스에적용되는 HostProtectionAttribute 특성의 Resources 속성값은 SharedState입니다. HostProtectionAttribute는대개아이콘을두번클릭하거나, 명령을입력하거나, 브라우저에서 URL을입력하여시작되는데스크톱응용프로그램에영향을미치지않습니다. 자세한내용은 HostProtectionAttribute 클래스나 SQL Server 프로그래밍및호스트보호특성을참조하십시오.
예제
다음코드예제에서는 Margins 형식의변수를문자열변수로변환합니다.
Visual Basic 
Dim strM As String
strM = "1,2,3,4"
            Dim m As New System.Drawing.Printing.Margins(1, 2, 3, 4)
Console.WriteLine(TypeDescriptor.GetConverter(strM).CanConvertTo(GetType(System.Drawing.Printing.Margins)))
Console.WriteLine(TypeDescriptor.GetConverter(m).ConvertToString(m))
 
C# 
string strM="1,2,3,4";
System.Drawing.Printing.Margins m= new System.Drawing.Printing.Margins(1,2,3,4);
Console.WriteLine(TypeDescriptor.GetConverter(strM).CanConvertTo(typeof(System.Drawing.Printing.Margins)));
Console.WriteLine(TypeDescriptor.GetConverter(m).ConvertToString(m));
 
C++ 
String^ strM = "1,2,3,4";
System::Drawing::Printing::Margins^ m = gcnew System::Drawing::Printing::Margins( 1,2,3,4 );
Console::WriteLine( TypeDescriptor::GetConverter( strM )->CanConvertTo( System::Drawing::Printing::Margins::typeid ) );
Console::WriteLine( TypeDescriptor::GetConverter( m )->ConvertToString( m ) );
 
J# 
String strM = "1,2,3,4";
System.Drawing.Printing.Margins m = new System.Drawing.Printing.
    Margins(1, 2, 3, 4);
Console.WriteLine(TypeDescriptor.GetConverter(strM).CanConvertTo(
    System.Drawing.Printing.Margins.class.ToType()));
Console.WriteLine(TypeDescriptor.GetConverter(m).ConvertToString(m));
상속계층구조
System.Object
   System.ComponentModel.TypeConverter
    System.ComponentModel.ExpandableObjectConverter
       System.Drawing.IconConverter
       System.Drawing.Printing.MarginsConverter
       System.Windows.Forms.ColumnHeaderConverter
       System.Windows.Forms.ListViewItemConverter
스레드로부터의안전성
이형식의모든 public static(Visual Basic의경우 Shared) 멤버는스레드로부터안전합니다. 인터페이스멤버는스레드로부터안전하지않습니다.
플랫폼
Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework에서모든플래폼의모든버전을지원하지는않습니다. 지원되는버전의목록은시스템요구사항을참조하십시오.
버전정보
.NET Framework
2.0, 1.1, 1.0에서지원
반응형

MSDN 의 내용을 발췌했습니다.

ㅡㅡ'


iterator
블록에서열거자개체에값을제공하거나반복이끝났음을알리기위해사용됩니다. 다음과같은형식중하나를사용합니다.
yield return expression;
yield break;
매개변수
expression
열거자개체에대한값으로계산되어반환됩니다. expression은반복기의 yield 형식으로암시적으로변환될수있어야합니다.
설명
yield문은 iterator 블록내에만포함될수있으며메서드, 연산자또는접근자의본문으로사용할수있습니다. 이러한메서드, 연산자또는접근자의본문에는다음제한사항이적용됩니다.
·         안전하지않은블록은사용할수없습니다.
·         메서드, 연산자또는접근자에대한매개변수는 ref 또는 out일수없습니다.
무명메서드에는 yield 문을사용할수없습니다. 자세한내용은 무명메서드(C# 프로그래밍가이드)를참조하십시오.
expression과함께사용할경우, catch 블록이나 catch 절이하나이상포함된 try 블록에는 yield return 문을포함할수없습니다. 자세한내용은 예외처리문(C# 참조)을참조하십시오.
예제
다음예제에서 yield 문은반복기블록인Power(int number, int power)메서드내에서사용됩니다. Power 메서드가호출되면숫자의거듭제곱이들어있는열거가능한개체가반환됩니다. Power 메서드의반환형식은반복기인터페이스형식인 IEnumerable입니다.
// yield-example.cs
using System;
using System.Collections;
public class List
{
    public static IEnumerable Power(int number, int exponent)
    {
        int counter = 0;
        int result = 1;
        while (counter++ < exponent)
        {
            result = result * number;
            yield return result;
        }
    }
 
    static void Main()
    {
        // Display powers of 2 up to the exponent 8:
        foreach (int i in Power(2, 8))
        {
            Console.Write("{0} ", i);
        }
    }
}
출력
2 4 8 16 32 64 128 256



행복한 고수되십시요...



woojja ))*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
반응형

+ Recent posts