레이블이 c#인 게시물을 표시합니다. 모든 게시물 표시
레이블이 c#인 게시물을 표시합니다. 모든 게시물 표시

2016년 1월 23일 토요일

c# keyvaluepair에 대해

KeyvaluePair는 컬렉션의 요소를 반환한다.
KeyValuePair 구조체로써
   [SerializableAttribute] 
   public struct KeyValuePair

설정하거나 검색할 수 있는 키/값 쌍을 정의한다.
또한 Dictionary.Enumerator.Current는 형식의 인스턴스를 반환하는데
Dictionary.Enumerator.Current는 열거자의 현재 위치에 있는 요소를 가져온다.

2016년 1월 20일 수요일

C# ?? 연산자

?? 연산자는 null 병합 연산자이며, null일 경우 왼쪽을 반환하고 null이 아닐 경우 오른쪽 피연산자를 반환한다. 코딩을 하다보면 null처리가 귀찮고 코드가 지저분해 지는데 이를 깔끔하게 해결할 수 있다.

(addData[i]["PlayerName"] ?? string.Empty).ToString()

addData[i]["PlayerName"] 가 null 이면 string.Empty가 처리된다.

2015년 11월 5일 목요일

람다식 예

public delegate Transform MapPosToT(int x, int y, int z);

StartCoroutine(Set_AreaTile((x, y, z) => CreateArea(x, y, z))); 

    IEnumerator Set_AreaTile(MapPosToT function)
    {
        ~~

            for (int j = 0; j < (int)AreaSize.y; j++)
            {
                Transform functionTile = function(i , j, 0); 

                if (functionTile != null)
                {
            ~~
        }

        yield return null;
    }

    public Transform CreateArea(int x, int y, int z)
    {   
        return GameObject.Instantiate(TilePrefab).GetComponent();
    }
람다식은 컴파일러가 인자를 할당한다라고 생각하면 이해하기 쉽다.

2015년 11월 2일 월요일

C# 가변배열

참조 : https://msdn.microsoft.com/ko-kr/library/2s05feca.aspx

가변 배열의 요소에는 배열이 사용됩니다. 따라서 가변 배열의 요소는 다양한 차원과 크기를 가질 수 있습니다. 가변 배열을 "배열의 배열"이라고도 합니다. 다음 예제에서는 가변 배열을 선언 및 초기화하고 가변 배열에 액세스하는 방법을 보여 줍니다.

다음은 3개의 요소를 가진 1차원 배열의 선언입니다. 이 배열의 각 요소는 1차원 정수 배열입니다.


int[][] jaggedArray = new int[3][];

jaggedArray를 사용하려면 먼저 요소를 초기화해야 합니다. 다음과 같이 요소를 초기화할 수 있습니다.
jaggedArray[0] = new int[5];
jaggedArray[1] = new int[4];
jaggedArray[2] = new int[2];

각 요소는 1차원 정수 배열입니다. 첫째 요소는 5개의 정수, 둘째 요소는 4개의 정수, 셋째 요소는 2개의 정수를 갖는 배열입니다.
초기 값을 사용하여 배열 요소를 값으로 채울 수도 있습니다. 이 경우 배열 크기를 지정할 필요가 없습니다. 예를 들면 다음과 같습니다.
jaggedArray[0] = new int[] { 1, 3, 5, 7, 9 };
jaggedArray[1] = new int[] { 0, 2, 4, 6 };
jaggedArray[2] = new int[] { 11, 22 };

2015년 9월 14일 월요일

델리게이트와 이벤트 관련

참조 : http://www.csharpstudy.com/CSharp/CSharp-delegate-concept.aspx

Abstract과 Virtual 차이



두개다 동작 방식은 비슷합니다.
차이점은 abstract는 구현코드가 없습니다. 반대로 virtual은 구현코드가 있습니다.

abstract는 주로 인터페이스에서 주로 볼수 있습니다. 즉 상속받은 클래스에서 구현을 해줘야 한다는 겁니다. 구현 코드가 없으므로 인스턴스를 생성할 수가 없습니다.
virtual은 상속한 클래스에서 재정의 해서 사용할 수 있도록 하기 위해서 사용합니다. 상속받은 클래스에서 재정의를 하지 않아도 됩니다. 인스턴스를 생성할 수 있습니다.

인덱서

참조 : http://blanedil.tistory.com/12
참조 : http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=17&MaeulNo=8&no=55680&ref=55672

1. 배열 연산자인 '[]'를 통해서 객체를 다룰 수 있도록 해주는 특별한 형태의 프로퍼티이다.
프로퍼티 이름 대신에 지정어 this를 사용한다.
2. 구조는 프로퍼티와 유사하며 get /set 접근자를 사용한다.
3. 객체를 인덱싱 하기 위한 index 인자를 가진다.
4. 이름 자체를 배열로 이용하기 떄문에 this 키워드가 인덱스의 이름으로 사용된다.

using System;
class IndexerClass
{
   private int [] myArray = new int[100];
   public int this [int index]   // Indexer declaration
   {
      get
      {
         // Check the index limits.
         if (index < 0 || index >= 100)
            return 0;
         else
            return myArray[index];
      }
      set
      {
         if (!(index < 0 || index >= 100))
            myArray[index] = value;
      }
   }
}

public class MainClass
{
   public static void Main()
   {
      IndexerClass b = new IndexerClass();
      // Call the indexer to initialize the elements #3 and #5.
      b[3] = 256;
      b[5] = 1024;
      for (int i=0; i<=10; i++)
      {
         Console.WriteLine("Element #{0} = {1}", i, b[i]);
      }
   }
}

얕은 복사와 깊은 복사

참조 : http://www.mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=21&ID=194


  1. 할당과 복사는 다르다.
  2. 보통 생성된 객체를 다른 변수로 참조할 경우 assign(할당) 한다고 한다.
  3. 복사는 기존 객체와 같은 값을 가지는 새로운 객체를 만든다는 것이다.
  4. 객체가 가진 값 형식과 참조 형식의 복제 방식에 따라 얕은 복사와 깊은 복사로 개념이 나뉜다.
  5. 얕은 복사는 단순 복사라고도 한다. 얕은 복사는 객체가 가진 멤버의 값들을 새로운 객체로 복사를 하는데 만일 객체가 참조타입의 멤버를 가지고 있다면 참조값만 복사된다
  6. 객체가 참조타입의 멤버를 포함할 경우 참조값의 복사가 아닌 참조된 객체 자체가 복사되는 것을 깊은 복사라 한다.




ref와 out의 차이점

출처 : http://mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=5&ID=193

out : 출력 매개 변수
1. 변수 초기화 필요치 않음 : 출력용 이기 때문에 함수로 전달되기 전 변수값 할당은 무의미 하다
2. 함수내 반드시 변수에 값 할당 : 출력용 이기 때문에 함수내에서 변수 값이 할당 되어야 함.

ref : 참조에 의한 전달
1. 변수 초기화 필요 : 일반 매개변수와 같은 의미
2. 함수내 값 설정하지 않아도 됨

StringBuilder를 쓰는 이유

코딩 정말 잘하시는 분과 같이 일할 기회가 있었는데
StringBuilder를 쓰지 않는거 보고 놀란적이 있습니다.;;;

참조 : http://www.mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=21&ID=534

여기서는 StringBuilder 을 사용했습니다. 
string 은 유명한(?) immutable 객체이죠. 즉 불변의, 변하지 않는 객체라는 뜻으로,
string s += "문자열" 연산할 때, 계속 새로운 객체가 생성되어 버립니다. 이전 객체는 가비지(Garbage)객체가 되구요
따라서 string 대신 StringBuilder을 사용했습니다
string 과 StringBuiler 의 비교는 이 글의 주제에 벗어나므로, 다른 자료를 찾아 보세요. (단 중요합니다)

위에 쓰인대로 + 떄마다 객체를 새로 생성합니다. ㄷㄷㄷ;

박싱과 언박싱

참조 : http://www.mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=5&ID=671

박싱 : 값 형식을 참조 형식으로 변화하는 것
언박싱 : 참조 형식을 값 형식으로 변환하는 것

박싱
1. 스택의 데이터가 힙으로 복사
예)
int = 123;
object o = i; //박싱(묵시적 변환)
언박싱
1. 힙에 있는 데이터가 스택으로 복사
예)
int i = 123;  // 형식
object o = i;  //박싱
int j = (int) o; //언박싱(명시적 변환)
>> 박싱/언박싱은 비용이 꽤나 많이 드는 작업
값 형식을 박싱 하는 경우 완전히 새로운 객체를 할당하고 구성해야 하며 언박싱에 필요한 캐스팅도
상당한 계산 과정이 필요합니다

boxing  unboxing 과정에는 많은 처리 작업이 필요합니다값 형식을 boxing할 때는 완전히 새로운 개체가
만들어져야 하며이러한 작업에는 할당 작업보다 최대 20배의 시간이 걸립니다. unboxing을 할 때는 캐스팅
과정에 할당 작업보다 4배의 시간이 걸릴 수 있습니다

편리하기는 하지만 그 만큼의 비용은 지불해야 하는 것입니다



2015년 4월 15일 수요일

C# Using 문

C#에서 Using문을 쓰는 이유는 간단합니다.

메모리를 가비지 컬렉터가 해제하기 때문이죠

즉 즉시 해제가 필요할 경우 사용하게 됩니다.

출처 :
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNo=8&no=117078&ref=117075

using문을 사용한 리소스 관리는, 좋고 나쁨을 따질수 있는 선택적인 사항이 아니라, 반드시 숙지하고 활용해야 할 사항입니다. 질문에서 약간 벗어난 이야기를 답으로 드리니 참고하셨으면 합니다.

using문을 이야기하려면 IDisposable 인터페이스에 대한 이야기를 해야 합니다.

기본적으로 닷넷은 가비지 컬렉터에 의해서 모든 리소스를 자동으로 관리한다고 소개하였고 실제로도 그렇습니다. 하지만 중요한 맹점이 하나 있는데, 닷넷 프레임워크 외부의 비관리 영역상의 자원에 대해서는 해당되는 부분이 없습니다. 파일 핸들, 메모리 핸들, 데이터베이스 연결, 소켓 핸들, 스레드 핸들, 세마포어 등의 모든 비관리 자원들에 해당되는 것입니다.

단순히 가비지 컬렉터에 의하여 처리되기를 기다린다면 이들 자원들은 사용량이 집중될 경우 고갈되어 시스템에 문제가 생길 수 있습니다. 따라서 이를 사전에 예방하고 효율적으로 관리하기 위해서 명시적인 소멸자를 직접 구현할 수 있는데, 이것이 IDisposable 인터페이스를 통해서 가능합니다.

본디, IDisposable 인터페이스로 소거를 시도하기 위해서는 아래와 같은 모양의 문법을 사용합니다.

IDisposable myObj = new SomethingDisposable();

try { /* try something here with myObj */ }
catch { throw; }
finally { if (myObj != null) myObj.Dispose(); }

위의 코드를 문법적으로 잘 포장한 것이 using 문입니다.

using (IDisposable myObj = new SomethingDisposable())
{
   /* try something here with myObj */
}

2015년 4월 3일 금요일

Namespaces and assemblies

출처 : Microsoft Visual C# 2012

Namespaces and assemblies


Classes are compiled into assemblies.
An assembly is a file that usually has the .dll 
file name extension, although strictly 
speaking, executable programs with the .exe file name extension are also assemblies.

You should note that there is not necessarily a 1:1 equivalence between an assembly 

and a namespace. A single assembly can contain classes defied in many namespaces, 
and a single namespace can span multiple assemblies.

클래스는 어셈블리 파일로 컴파일 됩니다.
어셈블리는 .dll 확장자를 가지는 파일이지만, .exe 파일또한 어셈블리 파일입니다.

꼭 1:1로 어셈블리와 네임스페이스가 일치하지 않습니다. 하나의 어셈블리는 많은 네임스페이스를 포함하거나, 싱글 네임스페이스는 다양한 어셈블리에 포함되어 있을 수 있습니다.

2015년 3월 26일 목요일

C# 추상(abstract) 클래스

추상 클래스의 특징


1. 인스턴스(객체)화 할수 없다.
2. 반드시 하나 이상의 추상멤버를 가져야 한다.

3. 단지 상속만을 목적으로 한다.
4. 순수하게 추상화된 클래스가 필요할 때 사용된다.
5. 클래스 내부에 정의된 멤버를 파생클래스에서 반드시 재정의 시키기 위해 사용된다.

6. 추상 멤버는 반드시 추상 클래스에 포함되어 있어야 한다.
7. 추상 멤버는 반드시 파생클래스에 정의되어야 한다.(virture와는 다르다, virture는 정의하지 않더라도 상관없다.)


출처 : http://channel.pandora.tv/channel/video.ptv?ch_userid=jiwan72&prgid=38324355

2014년 6월 2일 월요일

C# 버전관리

출처 : http://kimstar.pe.kr/blog/213
출처 : http://onlyican.tistory.com/entry/C-assembly-version-check

버전 관리 시


프로퍼티의 속성에 들어가서 직접 입력하는 방식과


AssemblyInfo 클래스에서 위의 이미지와 같이 편집하는 방식이 있습니다.

단 AssemblyInfo 클래스에서 편집한다면

오셈블리 정보창에서 편집은 안됩니다.(경고 창 팝업)

2014년 5월 25일 일요일

const, readonly

DoneStealth 소스 분석하는 도중에


player = GameObject.FindGameObjectWithTag(DoneTags.player).transform;

DoneTags 라는 클래스로 태그를 정리해 두었더군요




처럼 const를 사용해서 깔끔하게 정리했는데

인상적이더군요


const 다음과 같은 특징이 있습니다.

출처 : http://www.mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=5&ID=677

1. const 상수는 반드시 선언 시 그 값을 할당해야 한다
2. const 상수는 한번 값이 할당되면 이후 변경 불가능하다
3. const 상수는 자동으로 static 이다