반응형


AboutDelegate.zip



시나리오.


학교에 있는 학생을 도서관으로 이동하여 비동기 적으로 공부를 수행하고 끝난 후 다시 학교로 복귀하도록 구성하였다.


Main class

  1 namespace AboutDelegate

  2 {
  3     class Program
  4     {
  5         static void Main(string[] args)
  6         {
  7             School sc = new School();
  8             sc.GoLibrary();
  9             Console.WriteLine("호호호~~");
 10             Thread.Sleep(2500);
 11             Console.WriteLine("호호호~~");
 12             Thread.Sleep(2500);
 13             Console.WriteLine("호호호~~");
 14             Thread.Sleep(2500);
 15             Console.WriteLine("호호호~~");
 16             Thread.Sleep(2500);
 17             Console.ReadLine();
 18         }
 19     }
 20 }



Stu class

  1 using System;

  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading;
  6 
  7 namespace AboutDelegate
  8 {
  9     public class Stu
 10     {
 11         int num;
 12         string name;
 13         public Stu(int _num, string _name)
 14         {
 15             num = _num;
 16             name = _name;
 17         }
 18         public string Name
 19         {
 20             get
 21             {
 22                 return name;
 23             }
 24         }
 25         public int Num
 26         {
 27             get
 28             {
 29                 return num;
 30             }
 31         }
 32 
 33         public void Study(int cnt)
 34         {
 35             for (int i = 0; i < cnt; i++)
 36             {
 37                 Console.WriteLine("{0} 학생 {1} 시간째 공부중", Name, i+1);
 38                 Thread.Sleep(2500);
 39             }
 40         }
 41     }
 42 }
 43 


School class


  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Runtime.Remoting.Messaging;
  6 
  7 namespace AboutDelegate
  8 {    
  9     class School
 10     {
 11        
 12         Library lb=null;
 13         List<Stu> list = new List<Stu>();
 14         public School()
 15         {
 16             lb = new Library();
 17             Stu s = new Stu(1, "조스타");
 18             lb.AddStu(s);
 19             Stu s1 = new Stu(2, "좆스타");
 20             lb.AddStu(s1);
 21             Stu s2 = new Stu(3, "좆밥타");
 22             lb.AddStu(s2);
 23             Stu s3 = new Stu(4, "조스타킹");
 24             lb.AddStu(s3);
 25             Stu s4 = new Stu(5, "조조전");
 26             lb.AddStu(s4); 
 27             lb.SchoolCallEventHandler += new CallBackTest(EndStudy);
             //Library 에있는 SchoolCallEventHandler에 EndSTudy 함수를 등록한다(함수 포인터와 비슷)
 28         }
 29 
 30         public void GoLibrary()
 31         {
 32             lb.StartStudy();
 33         }
 34         public void EndStudy(Stu stu)
 35         {
 36             Console.WriteLine("{0} 학생 공부 완료", stu.Name);
 37             list.Add(stu);
 38             Console.WriteLine("{0} 학생 학교 복귀", stu.Name);
               // 학생 복귀
 39         }
 40     }
 41 }
 42 
 


Libray class

  1 using System;

  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Runtime.Remoting.Messaging;
  6 
  7 namespace AboutDelegate
  8 {
  9     public delegate void CallBackTest(Stu stu); 
 10     class Library
 11     {
 12         delegate void OnStudy(Stu s,int cnt);
 13         public event CallBackTest SchoolCallEventHandler; CallBackTest 이벤트 선언하여 School에서 사용
 14 
 15         List<Stu> list = new List<Stu>();
 16 
 17         public Library()
 18         {
 19         }
 20         public void AddStu(Stu s)
 21         {
 22             list.Add(s);
 23         }
 24         public void StartStudy()
 25         {            
 26             Random rand = new Random();
 27             OnStudy os;
 28             if (SchoolCallEventHandler != null)
 29             {
 30                 foreach (Stu stu in list)
 31                 {
 32                     os = new OnStudy(StudyOn); //학생마다 비동기적으로 동작해야 하므로 매번생성
 33                  os.BeginInvoke(stu, 3, EndOnStudy, stu);
                            //입력매개 변수 타입과 갯수만큼 앞에 넣어주고 다끝나고 동작할 함수 EndOnStudy를 등록한다.
 34                 }
 35             }
 36         }
 37 
 38         public void StudyOn(Stu s,int cnt)
 39         {
 40             //Console.WriteLine("{0} 번 학생 {1} 시간째 공부중", s.Name, cnt);
 41             s.Study(cnt);
 42         }
 43 
 44         public void EndOnStudy(IAsyncResult iar)
 45         {
 46             AsyncResult ar = iar as AsyncResult;
 47             Stu st = ar.AsyncState as Stu;
 48 
 49             OnStudy os = ar.AsyncDelegate as OnStudy;
 50             os.EndInvoke(iar);
 51             if (SchoolCallEventHandler != null)
 52             {
 53                 SchoolCallEventHandler(st); // 전에 등록한 이번트를 호출하여 학생을 되돌려주고 지워준다
 54              list.Remove(st);
 55             }
 56         }
 57     }
 58 }
 59 


반응형

'Programing > C#&.Net' 카테고리의 다른 글

명시적 어셈블리 로딩  (0) 2016.11.30
인덱서(Indexer) 예제  (0) 2016.11.30
리플렉션 활용  (0) 2016.11.30
리플렉션(reflection)  (0) 2016.11.30
어셈블리,메타데이터  (0) 2016.11.30
반응형

리플렉션활용


기존에 만들엇던 dll을 직접 등록하지 않고 런타임시 dll을 로딩해 사용하도록 하였다.


  class Program

    {
        static void Main(string[] args)
        {
            Assembly asm = Assembly.Load("SumBit");
            Type type = asm.GetType("SumBitS.SumBit");
            Object obj = Activator.CreateInstance(type);
            MethodInfo mi = type.GetMethod("Run");
            mi.Invoke(obj,null);
        }
    }


반응형

'Programing > C#&.Net' 카테고리의 다른 글

인덱서(Indexer) 예제  (0) 2016.11.30
Delegate(대리자) 프로그램  (0) 2016.11.30
리플렉션(reflection)  (0) 2016.11.30
어셈블리,메타데이터  (0) 2016.11.30
형식 메타데이터  (0) 2016.11.30
반응형

리플렉션


.NET 환경에서 리플렉션은 런타임에 형식에 대한 정보를 얻는 과정이다. 리플렉션 서비스를 이용하면, 런타임에 어셈블리를 로드할 수 있고, ildasm 메타데이터 창에서 볼 수 있었던 것과 같은 종류의 정보를 찾아낼 수 있다. 

리플렉션을 이용해 해당 어셈블리에 포함되어 있는 모든 형식들의 목록과 각 형식에 정의된 메소드,필드,속성 그리고 이벤트 등을 얻어낼 수 있다. 또한 해당 클래스가 지원하는 인터페이스나,메소드의 매개변수뿐만 아니라 기타 관련 내용들(기본클래스의 상세내용, 네임 스페이스 정보, 매니페스트 데이터 등)도 동적으로 찾아낼 수 있다.

반응형

'Programing > C#&.Net' 카테고리의 다른 글

Delegate(대리자) 프로그램  (0) 2016.11.30
리플렉션 활용  (0) 2016.11.30
어셈블리,메타데이터  (0) 2016.11.30
형식 메타데이터  (0) 2016.11.30
c# 프로그램 연습  (0) 2016.11.30
반응형

정의하는 어셈블리 문서화



어셈블리의 메타 데이터는 내부 형식들 뿐만 아니라 이 형식들에 의해서 참조되는 외부 형식들도 설명한다. 

System.Object형식에 대한 대한 TypeRef 블록을 볼 수 있다.





ildasm 메타데이터 창을 이용하면 Assembly 토큰을 이용해서 어셈블리 자신을 설명하는데 .NET 메타데이터를 볼 수도 있다. 다음의 목록에서 볼 수 있듯이 Assembly 테이블에 기록된 정보는 MAINIFEST 아이콘을 통해 볼수 있는 정보와 동일하다.





.NET 메타데이터는 TypeDef와 TypeRef블록과 Assembly 토큰 이외에도, AssemblyRef#n 토큰을 이용해서 각외부 어셈블리를 문서화 한다. MyFirstAssembly.dll 을 통해 사용하고 있는 것에 대한 AssemblyRef를 볼 수 있다.




.NET 메타데이테의 코드 베이스에 있는 모든 문자열 리터럴이 User Strings 토큰 아래에 문서화 된다. 




.NET 메타데이터가 매우 설명적이고 해당 코드 베이스에 있는 모든 내부에 정의된 형식을 나열하고 있다는 것이다. 

이 정보를 어떻게 활용할 수 있을지와 애ㅗ 신경써야하는 부분을 고려하기 위해선 .NET 리플렉션 서비스에 대해 알아보야 한다.


반응형

'Programing > C#&.Net' 카테고리의 다른 글

리플렉션 활용  (0) 2016.11.30
리플렉션(reflection)  (0) 2016.11.30
형식 메타데이터  (0) 2016.11.30
c# 프로그램 연습  (0) 2016.11.30
Delegate(대리자)  (0) 2016.11.30
반응형

메타데이터

메타데이터를 이용해서 형식을 완전하게 설명할 수 있다는 것이 .NET 런타임의 핵심 요소이다. 직렬화(serialization),원격(remotion),XML 웹 서비스와 같은 .NET기술은 모두 런타임에 형식들의 포멧을 알아낼 수 있기 때문에 가능한 것이다. 또한 교차 언어 상호운용성,컴파일러 지원, IDE의 인텔리센스 기능도 모두 형식에 대한 구체적인 설명이 있기 때문에 가능한 것이다. .NET형식은 클래스,인터페이스,구조체,열거형,델리게이트 중 하나이다. .NET 메타데이터는 이 형식들의 내부 구성을 설명하는데 이용되는 매개체이다. 


메타데이터는 그 중요성에도 불구하고 .NET Framework에만 있는 새로운 개념은 아니다. 예를 들어,COM에서 IDL은 해당 COM  서버 안에 있는 내부 COM 형식을 설명하는 데 이용된다. COM과 같이 .NET코드 라이브러리도 형식 메타데이터를 지원한다. .NET형식 메타데이터는 COM IDL과 동일한 문법을 갖지는 않는다. 형식 메타데이터는 내부적으로 더 도표화된(인덱스가 있는)포멧 문서화 된다. 


ildasm.exe 에 Ctrl+M 을 누루면 형식 메타데이터를 확인할 수 있다.



반응형

'Programing > C#&.Net' 카테고리의 다른 글

리플렉션(reflection)  (0) 2016.11.30
어셈블리,메타데이터  (0) 2016.11.30
c# 프로그램 연습  (0) 2016.11.30
Delegate(대리자)  (0) 2016.11.30
dll만들기 명령 프롬프트 사용  (0) 2016.11.30
반응형







-as , is 연산자

  1 private int checktype(Man mi)

  2         {
  3             if (mi is Stu && !(mi is StuTea)) return 1;            
  4             if (mi is StuTea) return 2;
  5             if (mi is Tea && !(mi is TeaStu)) return 3;
  6             if (mi is TeaStu) return 4;
  7 
  8             return -1;
  9         }



1 foreach (Stu st in lb)

  2             {
  3                 int num;
  4                 if ((num = lb.Compare(st, name)) == 1)
  5                 {
  6                     Stu stu = st;
  7                     return  stu as Man;
  8                 }
  9             }



-명시적, 묵시적 인터페이스 구현

  //명시적 인터페이스!

        void ITeach.Work()
        {
            Console.WriteLine("학생 선생입니다~ 공부하고 일하고 바빠~ 바쁨 IQ-2");
            int Iq = this.IQS;
            this.SettingIq(ref Iq, -2);
        }
        //묵시적 인터페이스!
        public void Teach()
        {
            Console.WriteLine("학생 선생입니다~ 가르칩니다~ IQ+2");            
        }

-static 클래스 구현

  public static class ShowWindow

    {      
        // 읽기전용 static 읽기전용
        static readonly ArrayList arr;
        static ShowWindow()
        {  
            arr = new ArrayList();
            SetShowwindow();
        }

        private static void SetShowwindow()
        {
           arr.Add(new Stu("조대준",42));            
           arr.Add(new Stu("대마왕", 142));
            
            arr.Add(new StuTea("조스타", 124));
            arr.Add(new StuTea("킹스타", 102));
           
            arr.Add(new Tea("최강사", 50));            
            arr.Add( new Tea("진짜강사", 84));
            
            arr.Add( new TeaStu("진중왕",45));            
            arr.Add(new TeaStu("왕중진", 55));          
            
        }

        public static string StaticToString()
        {
            bool type = false;
            foreach (object o in arr)
            {
                if (o is Stu && !(o is StuTea))
                {
                    if (!type)
                    {
                        Console.WriteLine("========= 학생 =========");
                    }
                    Console.WriteLine(o.ToString());
                    type = true;
                }
                if (o is StuTea)
                {
                    if (type)
                    {
                        Console.WriteLine("=========학생 선생 =========");
                    }
                    Console.WriteLine(o.ToString());
                    type = false;
                }

                if (o is Tea && !(o is TeaStu))
                {
                    if (!type)
                    {
                        Console.WriteLine("=========  선생 =========");
                    }
                    Console.WriteLine(o.ToString());
                    type = true;
                }

                if (o is TeaStu)
                {
                    if (type)
                    {
                        Console.WriteLine("========= 선생 학생=========");
                    }
                    Console.WriteLine(o.ToString());
                    type = false;
                }
            }
            return null;
        }

        public static Man CompareName(string _name)
        {            
            foreach (Man o in arr)
            {
                if (o.Name == _name)
                {
                    if (o is Stu && !(o is StuTea))
                    {
                        Stu stu = o as Stu;
                        return stu.Clone() as Man;   
                    }
                    if (o is StuTea)
                    {
                        StuTea stutea = o as StuTea;
                        return (StuTea)stutea.Clone() as Man;                        
                    }
                    if (o is Tea && !(o is TeaStu))
                    {
                        Tea tea = o as Tea;
                        return tea.Clone() as Man;
                    }
                    if(o is TeaStu)
                    {
                        TeaStu tea = o as TeaStu;
                        return (TeaStu)tea.Clone() as Man;
                    }
                    return null;
                }                
            }
            return null;
        }
    }

-static 생성자 구현

  //static 생성자!!

        static LecturRoom()
        {
            singleton = new LecturRoom();
        }
        private LecturRoom()
        {
            Console.WriteLine("강의실 생성");
            Console.ReadLine();
        }    

-abstract 클래스 구현

 //abstract 클래스!!!

    public abstract class Man: IComparable
    {
        string name;             

        readonly int hp;
        const int min_Hp = 0;
        const int max_Hp = 100;

        public Man(string _name)
        {
            name = _name;
            hp = max_Hp;
        }
        //비대칭 속성!!
        public string Name
        {
            get
            {
                return name;
            }
            private set
            {
                if (Avail(value))
                {
                    name = value;
                }
            }
        }

        private bool Avail(string value)
        {
            return (value != null);
        }


        public int CompareTo(object obj)
        {
            Man man = obj as Man;
            if(man !=null)
            {
                return this.Name.CompareTo(man.Name);
            }
            else
            {
                throw new Exception("안되요...");
            }
        }
        public override string ToString()
        {
            return "체력 : " + hp+"\n";
        }  

    }

    class StuHelper :IComparer<Man>
    {
        #region IComparer(Man) 멤버

        public int Compare(Man x, Man y)
        {
            return x.Name.CompareTo(y.Name);
        }

        #endregion
    }

-sealed 클래스 구현

 // sealed 클래스!!

    public sealed class TeaStu : Tea  ,IStudy,ICloneable
    {
        public TeaStu(string _name, int _charisma)
            : base(_name, _charisma)
        {
        }
        public TeaStu(string _name)
            : base(_name)
        {
        }
        public override string ToString()
        {
            return base.ToString();
        }
        public void Study()
        {
            Console.WriteLine(" 강사지만 열심히 공부한다~~~");
        }
        public override void Heal()
        {
            Console.WriteLine("선생이 배우고 가르치고 힘들다 쉬어야지~~");            
        }

        #region ICloneable 멤버

        public object Clone()
        {
            Console.WriteLine("이름을 입력하세요~");
            string _name = Console.ReadLine();
            return new TeaStu(_name, this.Charisma);
        }

        #endregion
    }

-ToString 재정의 구현

  //ToString 재정의!

        public override string ToString()
        {
            return "이름 : " + this.Name + " 카리스마 : " + charisma + "\n" + base.ToString();
        }

-읽기전용, static 읽기전용 구현

  public static class ShowWindow

    {      
        // 읽기전용 static 읽기전용
        static readonly ArrayList arr;
        static ShowWindow()
        {  
            arr = new ArrayList();
            SetShowwindow();
        }
    }

-const 멤버 구현 (Man 속성)

  const int min_Hp = 0;

const int max_Hp = 100;


-비대칭 속성 구현 (Man 속성)

  //비대칭 속성!!

        public string Name
        {
            get
            {
                return name;
            }
            private set
            {
                if (Avail(value))
                {
                    name = value;
                }
            }
        }

-base 키워드 구현
-IComparer,IComparable 구현 (Stu 클래스 내 구현, Helper클래스 사용)

  public int CompareTo(object obj)

        {
            Man man = obj as Man;
            if(man !=null)
            {
                return this.Name.CompareTo(man.Name);
            }
            else
            {
                throw new Exception("안되요...");
            }
        }
       

    }

    class StuHelper :IComparer<Man>
    {
        #region IComparer(Man) 멤버

        public int Compare(Man x, Man y)
        {
            return x.Name.CompareTo(y.Name);
        }

        #endregion
    }

-IEnumerable,IEnumerator 구현(LectureRoom)

  #region IEnumerator 멤버

        object IEnumerator.Current
        {
            get
            {
                if (iteach != null)
                {
                    return iteach;
                }
                return istudies[index];
            }
        }

        bool IEnumerator.MoveNext()
        {
            index++;
            if (index < istudies.Count)
            {
             
                return true;
            }
            Reset();
            return false;

        }

        public void Reset()
        {
            index = -1;
        }

        #endregion

        #region IEnumerable 멤버

        public IEnumerator GetEnumerator()
        {
            return (IEnumerator)this;
        }

        #endregion

-ICloneable 구현

  #region ICloneable 멤버

        public object Clone()
        {
            Console.WriteLine("이름을 입력하세요~");
            string _name = Console.ReadLine();
            return new TeaStu(_name, this.Charisma);
        }

        #endregion

-인덱서 구현

 //인덱서

        public Tea this[string index] 
        {
            get
            {
                foreach (Tea t in stulist)
                {
                    if (t.Name == index)
                    {
                        return t;
                    }
                }
                return null;
            }            
        }

-out,ref 구현

  public double CheckAverage(ref double number)

        {
            int i=0;            
            double sum = 0;
            foreach (Stu st in libarr)
            {
                sum += number - st.IQS;                
            }
            double gap = sum / libarr.Count;            
            number = number - gap;            
            return number;          
        }


반응형

'Programing > C#&.Net' 카테고리의 다른 글

어셈블리,메타데이터  (0) 2016.11.30
형식 메타데이터  (0) 2016.11.30
Delegate(대리자)  (0) 2016.11.30
dll만들기 명령 프롬프트 사용  (0) 2016.11.30
c# 기초  (0) 2016.11.30
반응형
Delegate(대리자)

delegate는 명명된 메서드나 익명 메서드를 캡슐화하는 데 사용할 수 있는 참조 형식입니다. 대리자는 C++의 함수 포인터와 비슷하지만 형식 안전성과 보안성을 제공한다는 점이 다릅니다

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

namespace DeclareaDelegate
{
    class MathClass
    {
        public void MultiplyNumber(int m, double n)
        {
            Console.WriteLine(m * n + "");
        }
    }
    delegate void del(int i,double j);
    class Program
    {
        static void Main(string[] args)
        {
            MathClass m = new MathClass();
            
            del d = m.MultiplyNumber;
            Console.WriteLine("Invoking the delegate using 'MultiplyNumbers':");
            for (int i = 1; i <= 5; i++)
            {
                d(i, 2);
            }
            System.Console.WriteLine("Press any key to exit.");
            System.Console.ReadKey();
        }
    }

}


반응형

'Programing > C#&.Net' 카테고리의 다른 글

형식 메타데이터  (0) 2016.11.30
c# 프로그램 연습  (0) 2016.11.30
dll만들기 명령 프롬프트 사용  (0) 2016.11.30
c# 기초  (0) 2016.11.30
마샬링(marshalling)  (0) 2016.11.30
반응형





csc /t:module IStudy.cs
csc /t:module ITeach.cs
csc /t:library /addmodule:IStudy.netmodule,ITeach.netmodule MyInterface.cs
csc /t:library Man.cs
csc /t:library /r:Man.dll,MyInterface.dll Stu.cs
csc /t:library /r:Man.dll,MyInterface.dll Tea.cs
csc /t:library /r:Man.dll,MyInterface.dll,Stu.dll StuTea.cs
csc /t:library /r:Man.dll,MyInterface.dll,Tea.dll TeaStu.cs
csc /t:library /r:Stu.dll,MyInterface.dll,Man.dll Library.cs
csc /t:library /r:Tea.dll,MyInterface.dll,Man.dll ReadyRoom.cs
csc /t:library /r:MyInterface.dll LecturRoom.cs
csc /t:library MyMethod.cs
csc /t:library /r:Stu.dll,StuTea.dll,Tea.dll,TeaStu.dll,Man.dll,MyInterface.dll ShowWindow.cs

csc /t:library /r:Stu.dll,StuTea.dll,Tea.dll,TeaStu.dll,Man.dll,ShowWindow.dll,MyMethod.dll,LecturRoom.dll,ReadyRoom.dll,Library.dll,MyInterface.dll Sumbit.cs
csc /t:exe /r:Sumbit.dll Program.cs


반응형

'Programing > C#&.Net' 카테고리의 다른 글

형식 메타데이터  (0) 2016.11.30
c# 프로그램 연습  (0) 2016.11.30
Delegate(대리자)  (0) 2016.11.30
c# 기초  (0) 2016.11.30
마샬링(marshalling)  (0) 2016.11.30
반응형
.Net is a for Web-Service.

COM 전략의 실패 - 레지스트리에 등록
-> 서비스 벤더 자체 프로토콜

JVM : .NET 플랫폼 - 미들웨어

App
M/W
Native

C++
Reference 형식 
형식 불안정

java .NET
형식안정적 -> 세대조사 0세대,1세대,2세대(세대조사 이유.성능저하)



.NET 3가지특징
- CTS Common type system 
- CLS Common Language Specification 공용언어를 사용시 최소한에 지켜야할 사항(외부로 노출된 것을 공용으로 사용할수 있는것으로)
- CIR Common Language Runtime 
핵심 -> jitter = Just It Tiem Complier , 공통라이브러리(COL)로딩

/////////////////////////////////////////////////////////////////////////////////
c#
형식(type)

value 
-구조체
- int
- char
- bool
   .
   .   
-열거형

reference
- Class
- delegate(암시적 Class)
- interface (Class로 취급해도 문제없음)
- string (동작은 value 처럼 사용해도 지장없음)

value 형은 Stack영역에 활당

reference 형은 Heap 영역에 활당
참조된 변수를 null로 바꿔주는 것 만으로도 효과적

objectClass
value type
reference type


int i = 7;
object o = i; // Boxing

int k = (int)o; // UnBoxing

제러릭(템플릿과 비슷)
제러릭 컬릭셕(성능에 향상) value 형식을 컨터이너에 보관할때 

foreach - 열거 가능한 형식에 대해서만 가능
 
Arraylist ar = new Arraylist();

ar.Add(3);
ar.Add(6);
ar.Add(8);

foreach(int i in ar)
{
Console.WiteLine(i.ToString());
}

OOP 3대속성
캡슐화
- 필드
- 상수
- 읽기전용
- 메소드
- 속성
- 등등등~

class stu
{
const int val = 7; (컴파일시)
readonly int num = 9; or 생성자에서만 초기화 가능! 
static readonly int num; // 가능 (런타임시)
}

상속(파생),다형성

abstract class stu
//클래스내에 순수가상함수가 하나도 없어도 해당 클래스를 생성할 수 없다
abstract 메소드 = 순수가상함수

BaseClass에 void Foo() 라는 메소드를 파생 클래스에서 무효화 하려면
파생Class 내에 new void Foo() 라 명시하면 BaseClass에 void Foo()는 무효화

sealed class stu  봉인 클래스
봉인된 클래스는 base클래스가 될 수 없다


다형성에서 주의사항

-기반 클래스는 하나만 명시가능 맨 앞에 명시 (다중상속 x) 
class MStu : Stu, IStudy //맨 앞이 기반 클래스 뒤로 인터페이스
{
}

구현약속
interface IStudy
{
void Study(); /// abstract,public
}


형식변환
RTTI

형식확인
is 연산 value 형식에 대해 사용을 많이 함
object o;
if(o is int)
if(o is char)

as 연산 //reference 형식만가능
int i = o as int;// 불가능
참이면 값대입 거짓이면 null 대입

Teacher t = o as Teacher;
if( t != null)
{
불라불라~
}


연산자 중복정의  
== 와 != 같이 정의해야됨~~
다른경우도 마찬가지
class Foo
{
int i;
public Foo(int _i){i = _i;}
public static bool operator == (Foo f, Foo f2)
{
return f.i == f2.i;
}
public static bool operator !=(Foo f, Foo f2)
{
return f.i != f2.i;
}
}

//명시적
class Foo
{
int i;
public static explicit operator int(Foo foo)
{
return foo.i;
}
public static explicit  operator Foo(int v)
{
return new Foo(v);
}
}

Foo foo = new Foo(3);
int i = (int)foo;

Foo foo2 =(Foo)i;


//위와 비슷
//암시적
class Foo
{
int i;
public implicit operator int(Foo foo)
{
return foo.i;
}
public implicit operator Foo(int v)
{
return new Foo(v);
}
}
Foo foo = new Foo(3);

int i = foo;

Foo foo2 =i;

속성 
   class stu
    {
        int score;
        public int socre
        {
            get
            {
                return socre;
            }
            protected set //비대칭 속성
            {
                if (AvailSocre(value))
                {
                    socre = value;
                }
            }
        }

        private bool AvailSocre(int value)
        {
            return (value <= 100);
        }
    }


static 

    static class MyGeneral //모든 맴버 가 static 이여야 한다.
    {
        static public int Add(int a, int b)
        {
            return a + b;
        }
    }

    class MyGeneral
    {
        static int num;
        static MyGeneral() //  static 생성자 입력 매개변수 접근 사용자를 명시할수 없음. static 생성자는 .NET 스스로 호출
        {
            num = 0;
        }
    }


class Book
    {
    }
    class MyGeneral
    {
        const int num = 5;
        static readonly Book book;
        static MyGeneral() 
        {
            book = new Book();
        }
    }

    class Book
    {
    }
    class MyGeneral
    {
        static const Book book2 = new Book();
        static readonly Book book;
        static MyGeneral() 
        {
            book = new Book();
        }
    }



상속
    class BaseClass
    {
        public BaseClass(int a)
        {
        }
        public virtual void Foo()
        {
        }
       
    }

    class Derived : BaseClass
    {
        public Derived() : base(8)
        {
        }
        public override void Foo()
        {
            base.Foo();
        }        
    }
//입력매개변수가 없는 생성자는 구조체에 선언 할 수 없다.
순수 가상함수 상속 abstract

 abstract class BaseClass
    {
        public BaseClass(int a)
        {
        }
        public abstract void soo();

        public virtual void Foo()
        {
        }
       
    }

    class Derived : BaseClass
    {
        public Derived() : base(8)
        {
        }
        public override void Foo()
        {
            base.Foo();
        }
        public override void soo()
        {
            throw new NotImplementedException();
        }
    }


강제 소멸자
    abstract class BaseClass : IDisposable
    {
        bool check;
        public BaseClass(int a)
        {
        }
        public abstract void soo();
        public void Dispose()
        {
            if (check == false)
            {                
                GC.SuppressFinalize(this);
                check = true;
            }
        }


입력 매개변수 전달 유형

return , in, out , ref

ref

       void Foo()
        {
            int i = 2;
            Soo(ref i);
        }
        void Soo(ref int i)
        {
            if ((i % 2) == 0)
            {
                i = 3;
            }
        }

out

    class BaseClass
    {
        public void Foo()
        {
            int i = 3;
            int j = 9;
            int max;
            int u = Add(i, j, out max);
            Console.WriteLine("{0},{1}",u,max);
        }
        int Add(int a, int b, out int v)
        {
            v = b;
            if (a > b)
            {
                v = a;
            }
            return a + b;
        }
    }


배열

Array 클래스에서 부터 파생
int [ ] arr = new int[7];
int[ , ] arr = new int[3,4];
int [][] arr = new int [3][]; 제그드배열~~~~~~~~지그제그지그제그
arr[0] = new int [2];
arr[1] = new int[10];
arr[2] = new int[5];

foreach(int []ar in arr)
{
foreach(int i in ar)
{
Console.WiteLine(i.ToString);
}
}


Arrage.Sort(arr); // 비교가 가능한 대상이라면 정렬가능

string

string s = string.Empty; // 습관처럼 이용

문자열은 char의 읽기전용 컬렉션이다!

조합을 사용할때
StringBuilder sb = new StringBuilder("hello");
사용이 효율적
string s;
s = string.format("{0}{1}","asdasd",asdasdasdasd"); 이런식으로



인터페이스

 interface IStudy
    {
        void Study();
        void Work();
        int Num // 이런것도 가능
        {
            get;
            set;
        }
    }
    interface ITeach
    {
        void Teach();
        void Work();
    }
    class Man
    {
    }
    class Stu : Man, IStudy,ITeach
    {        
        public void Study()
        {
        }
        public void Teach()
        {
        }
        void ITeach.Work()
        {
        }
        void IStudy.Work()
        {
        }
        int IStudy.Num
        {
            get;
            set;
        }

    }


반응형

'Programing > C#&.Net' 카테고리의 다른 글

형식 메타데이터  (0) 2016.11.30
c# 프로그램 연습  (0) 2016.11.30
Delegate(대리자)  (0) 2016.11.30
dll만들기 명령 프롬프트 사용  (0) 2016.11.30
마샬링(marshalling)  (0) 2016.11.30
반응형
마샬링(marshalling)
마샬링이란 컴퓨터 프로그래밍에서 하나 이상의 프로그램 또는 연속되어 있지 않은 저장 공간으로 부터
데이터를 모은 다음, 데이터들을 메시지 버퍼에 집어넣고, 특정 수신기나 프로그래밍 인터페이서에 맞도록 그 데이터를 조직화 하거나, 미리 정해진 다른 형식으로 변환하는 과정을 말한다. 마샬리은 대체로, 어떤 한 언어로 작성된 프로그램의 출력 매개변수들을 다른 언어로 작성된 프로그램의 입력으로 전달해야 하는 경우에 필요하다. 

반면,  언마샬링은...
 
마샬링을 통해 보내진 데이터들을 원래 구조로 복원시키는 것이다. 이러한 의미에서  개체 입출력을 위해 개체를 직렬화serialize 하고 복원deserialize 하는 과정과 비슷합니다. 다만 마샬링과 언마샬링은 단순한 데이터의 직렬화가 아니라, 구조화된 대상들에 대해 구조 해체/복원이 개입할 때 사용하는 개념이라는 점이 다릅니다.

실매개변수
프로그래밍 언어에서 프로시저나 함수를 호출할 때 호출하는 쪽에서 실제로 넘겨주는 변수 또는 수식. 이는 실행시에 그 값에 계산되어 프로시저의 형식 인수(formal parameter)에 대응되어 넘겨진다.
 
void int foo(int num) <-형식매개변수
foo(20); <- 실매개변수


반응형

'Programing > C#&.Net' 카테고리의 다른 글

형식 메타데이터  (0) 2016.11.30
c# 프로그램 연습  (0) 2016.11.30
Delegate(대리자)  (0) 2016.11.30
dll만들기 명령 프롬프트 사용  (0) 2016.11.30
c# 기초  (0) 2016.11.30

+ Recent posts