2010. 3. 31. 10:45
리플렉션을 어설프게 이해해서 제대로 정리하지는못했다 -_-
다음에 더 정리가되면 다시 2탄을 올리도록하겠다.

1.
네임스페이스 리플렉션 ( System.Reflection ) 에 있는  Assembly 클래스를 이용한다.
 Assembly asm = Assembly.Load("SB");  SB.dll 파일을 로딩한다.

2.
해당 파일에 있는 네임스페이스명.클래스명을 불러온다.
Type type = asm.GetType("asem.SB");


아래와 같이해서 가져올 네임스페이스명과 클래스명을 알 수 있다.
foreach(Type i in asm.GetType())
{
Console.WriteLine(i.FullName)  
}

방법1

해당 클래스에서 프로퍼티를 가져온다.
해당 프로퍼티에서는 get으로 객체를 반환해준다.
GetValue를 통해 PropertyInfo에 있는 가져온 프로퍼티 값을 object에 넣어준다.

            PropertyInfo pi = type.GetProperty("sb");  
            object o = pi.GetValue(null, null); //첫번째 : obecjt  두번째 : 가져올 object의 인덱스
                                                           
이렇게 해서 해당 객체를 실행시킬 수 있다.

방법2

object obj = Activator.CreateInstance(stu, "진용", cnt++);  //해당겍체를 가져온다.
            MethodInfo mi =  stu.GetMethod("Study");          //클래스의 Study 메소드를 가져온다.
            mi.Invoke(obj, null);                                        //가져온 해당 객체를 실행시킨다.

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

윈도우 서비스 만들기  (0) 2010.04.04
ReadLine, Read, ReadKey  (0) 2010.04.03
Const Vs Readonly  (0) 2010.03.29
Sealed  (0) 2010.03.29
Sort메소드  (0) 2010.03.28
Posted by 아몰라
2010. 3. 29. 18:35

const vs readonly
readonly 키워드는 const 키워드와 다릅니다. const 필드는 필드를 선언할 때만 초기화될 수 있습니다. readonly 필드는 필드를 선언할 때 또는 생성자에서 초기화될 수 있습니다. 따라서 readonly 필드의 값은 사용된 생성자에 따라 다릅니다. 또한 const 필드는 컴파일 타임 상수인 반면 readonly 필드는 다음 예제에서와 같이 런타임 상수로도 사용할 수 있습니다.
출처 : msdn.microsoft.com

컴파일 타임 상수 vs 런타임 상수

컴 파일 타임 상수는 코드가 컴파일될 때 계산되고 런타임 상수는 응용 프로그램이 실행되는 동안에만 계산됩니다. 컴파일 타임 상수는응용 프로그램 실행에 관계없이 항상 같은 값을 갖지만 런타임 상수는 매번 변경될 수 있습니다. 컴파일 타임 상수는 배열 범위,case 식 또는 열거자 이니셜라이저 등의 경우에 필요합니다.

출처 : msdn.microsoft.com

컴파일타임 상수는 런타임 상수에 비해 다소 빠르지만 유연성이 떨어진다. 컴파일 타임 상수는수행성능이 매우 중요하고 상수값이 절대로 바뀌지 않는 경우에 한해서만사용하는 것이 좋다.

컴 파일 타임 상수는 단지 내장자료형(정수형, 실수형) 이나 enum, string 에 대해서만 사용될수 있다. 이는 내장 자료형만이 유일하게 변수의 초기화 단계에서의 의미를 가지고 문자 자체로 표현되는 값(literal value)을 대체할 수 있기 때문이다.
출처 : Effective C#
 
장단점

readonly 대신 const 를 썼을 때의 유일한 장점은 수행성능이다. 이미 알려진 상수값에 직접 접근하는 효율이 readonly로 지정된 변수의 값을 참조하는 것에 비해서 조금 더 빠르다.그렇지만 이를 통해 얻을수 있는 수행성능의 개선효과가 작고 무엇보다 유연성을 감소시키는 단점이 있다. 유연성을 포기하기 이전에 수행성능에 미치는 영향을 먼저 명확하게 하자.
출처 : Effective C#

즉 const 로 선언한것은 변경을 하더라도 전체 컴파일 전까지는 반영된 내용이 적용되지 않습니다. 즉 const 로 선언한것을 수정할 경우는 재컴파일 하지 않고 배포한다면 원하는 결과는 나오지 않기 때문에 변경에 빈도가 있는 것은 const 를 사용하지 않는것이 좋습니다. 

역시 코드를 보는게 이해하기 쉽겠죠 ?? 밑에 내용은 msdn 에 있는 샘플 코드 입니다.







C# 언어 사양
10.4.2.2 상수 및 정적 읽기 전용 필드의 버전 관리

상 수와 읽기 전용 필드의 이진 버전 관리 의미는 다릅니다. 식에서 상수를 참조할 경우 컴파일 타임에 상수 값을 가져오지만, 식에서 읽기 전용 필드를 참조할 경우 런타임까지 필드 값을 가져오지 않습니다. 별개의 두 프로그램으로 구성된 응용 프로그램을 살펴보겠습니다.


using System;
namespace Program1
{
   public class Utils
   {
      public static readonly int X = 1;
   }
}
namespace Program2
{
   class Test
   {
      static void Main() {
         Console.WriteLine(Program1.Utils.X);
      }
   }
}

Program1Program2 네임스페이스는 별도로 컴파일된 두 프로그램을 나타냅니다. Program1.Utils.X를 정적 읽기 전용 필드로 선언했기 때문에 Console.WriteLine 문에서 출력하는 값을 컴파일 타임에 알 수 없으며, 런타임에 해당 값을 가져옵니다. 따라서 X 값이 변경되고 Program1이 다시 컴파일되면 Program2가 다시 컴파일되지 않더라도 Console.WriteLine 문이 새 값을 출력합니다. 그러나 X가 상수였기 때문에 Program2를 컴파일 할 때 X 값을 가져오며, Program2를 다시 컴파일할 때까지 Program1의 변경으로 인해 영향을 받지 않습니다.

출처 : msdn.microsoft.com
즉 program1 에 x 를 2로 변경후 Program1 만 컴파일 한다면 Program2 에서 찍어보는값은 변경이 적용된 값입니다. 
여기서 program1 에 x 값은 2로 변경한 값을 유지하고 Program3 을 추가하고 Program2 다음과 같이 변경했다고 가정해봅시다.
 
namespace Program3
{
   public class Utils
   {
      public const int X = 1;
   }
}

namespace Program2
{
   class Test
   {
      static void Main() {
         Console.WriteLine(Program1.Utils.X);
         Console.WriteLine(Program3.Utils.X);

      }
   }
}
이 코드에 결과는 2,1 입니다. 두번째 Program3.Utils.X 값을 2로 변경하고 Program1 과 Program3를 컴파일해서 돌린다면 결과는 2,1 입니다. Program2 를 컴파일 하기 전까지 const 값은 변경된 내용이 반영되지 않습니다.

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

ReadLine, Read, ReadKey  (0) 2010.04.03
어셈블리 동적 로딩  (0) 2010.03.31
Sealed  (0) 2010.03.29
Sort메소드  (0) 2010.03.28
Delegate-2  (0) 2010.03.27
Posted by 아몰라
2010. 3. 29. 15:37

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

namespace ClassTest4
{
    class AB
    {
        public virtual void ABC()
        {
            Console.WriteLine("A-ABC");
        }
        public virtual void Display()
        {
            Console.WriteLine("A-Display");
        }
        public virtual void Output()
        {
            Console.WriteLine("A-Output");
        }
    }
    class A:AB {
        public sealed override void ABC() {
            Console.WriteLine("A-ABC");
        }
        public override void Display()
        {
            Console.WriteLine("A-Display");
        }
        public override void Output()
        {
            Console.WriteLine("A-Output");
        }
    }
    class B :A{
        /*    public override void ABC() {
                Console.WriteLine("B-ABC");
            } 위가 실드로 되어있어서 재정의 못함*/

        public override void Display() {
            Console.WriteLine("B-Display");
        }
    }

    class CTest
    {
        static void Main(string[] args)
        {
            A pA = new A();
            pA.ABC();pA.Display();pA.Output();
            pA = new B();
            pA.ABC();pA.Display();pA.Output();
        }
    }
}

n1. sealed 클래스
- sealed 클래스는 파생 클래스에서 사용할 없는 클래스 이다.
- sealed 클래스는 상속을 막는 클래스 이다.
- sealed 클래스는 보안 코드 설계 부분의 명확하게 하기 위해 사용
- sealed클래스는 상업적인 코드 내부구현이 복잡해 파생클래스에서
  오버라이드하면 문제가 발생할 가능성이 있는 코드를 사전에 차단할 용도로 사용
n2. sealed 메서드
- sealed 메서드는 파생 클래스에서 오버라이드 없다.
- sealed 메서드는 꼭 override 앞에서만 사용할 수 있다.
- 하지만 sealed를 쓰면 상속을 줄 수 없으므로 후위 클래스에서 재정의 할 수 없다.



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

어셈블리 동적 로딩  (0) 2010.03.31
Const Vs Readonly  (0) 2010.03.29
Sort메소드  (0) 2010.03.28
Delegate-2  (0) 2010.03.27
직렬화  (0) 2010.03.27
Posted by 아몰라