블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

프로퍼티 창에서 SelectionMode를 FullRowSelect로 하시면 됩니다.^^


출처 : http://www.hoons.kr/Board.aspx?Name=QACSHAP&Mode=2&BoardIdx=34027&Key=Title&Value=datagrid+%ed%95%9c%ec%a4%84
반응형

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

DataGridView 활용 Tip  (0) 2010.08.19
메서드 매개 변수(C# params/ref/out)  (0) 2010.08.18
DataSet 및 DataGrid 관련 팁  (0) 2010.08.17
File과 Directory, Path  (0) 2010.08.16
GDI+ 선  (2) 2010.08.03
Posted by blueasa
, |

// 특정 테이블의 컬럼의 데이터를 가져오기
dataSet.Tables[0].Rows["CameraName"][0].ToString()

 

// 현재 시간 데이터 조회
System.DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss");

 

// DataGrid에서 새로운 데이터가 추가될 때 이벤트
dataGrid.InitializingNewItem += new InitializingNewItemEventHandler(dataGrid_InitializingNewItem);

 

// DataSet에 새로운 레코드가 추가될 때 이벤트
dt.TableNewRow += new DataTableNewRowEventHandler(dt_TableNewRow);
...

public void DataUpdate()
{           
    dataBaseHandler.DataAdapterUpdate(dataSet);
}

반응형

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

메서드 매개 변수(C# params/ref/out)  (0) 2010.08.18
datagrid에서 클릭하면 한 줄이 선택되도록 할 수 있나요?  (0) 2010.08.17
File과 Directory, Path  (0) 2010.08.16
GDI+ 선  (2) 2010.08.03
C#의 가변인자 전달  (1) 2010.07.28
Posted by blueasa
, |

1. 파일과 디렉터리를 나타내는 클래스

 

 

  - 파일(File), 디렉터리(Directory) 관련 클래스들

    : FileSystemInfo _ 파일 시스템을 나타내는 기본 클래스

    : Directory, DirectoryInfo _ 디렉터리를 나타내는 기본 클래스

    : File, FileInfo _ 파일을 나타내는 기본 클래스

    : Path _ 경로를 조작하기 위한 기본 클래스

 

 

2. File 클래스

 

  - using System.IO;

 

  - File 클래스

    : public sealed class File

    : 파일 관련 함수 제공

    : 멤버 함수들이 public static으로 선언

    : 파일에 관련된 정보(파일의 존재여부, 파일의 생성시간, 최종 액세스시간, 최종 저장시간 등)을 알아낼 수 있다. 파일 삭제, 복사, 이동 등의 작업이 가능하다.

 

  - 파일 복사하기

    : File.Copy("FileTest.cs", "Output.txt", true);

 

  - 파일 존재 확인하기

    : bool exist = File.Exists("./Output.txt")

 

  - 파일 생성 시간 알아내기

    : DateTime dt = File.GetCreationTime("./Outout.txt");

 

 

3. File 클래스를 이용한 FileStream 생성

 

  - File 클래스의 역할 : FileStream의 객체 생성, 파일 관련 함수 제공

 

  - File을 이용해서 파일 스트림 생성

    : FileStrea fs = File.OpenRead("./herol.txt");

 

  - 문자 스트림 변환

    : StreamReader r = new StreamReader(fs, System.Text.Encoding.Default);

 

  - 커서의 위치를 첫부분에 위치시킨다.

    : r.BaseStreamSeek(0, SeekOrigin.Begin);

 

  - 데이터가 존재한다면 한줄 씩 읽어낸다.

    : while(r.Peek() > -1){

        Console.WriteLine(r.ReadLine());

      }

 

  - 스트리을 닫는다.

    : r.Close();

 

  - File 클래스의 함수들

    : AppendText() -> UTF-8로 인코딩된 텍스트를 추가하는 StreamWriter를 만든다.

    : Copy() -> 새 파일에 기존 파일을 복사

    : Create() -> 경로에 파일을 만든다.

    : CreateText() -> UTF-8로 인코딩된 텍스트를 쓰기 위해 새 파일을 만들거나 연다.

    : Delete() -> 파일을 삭제한다. 지정된 파일이 없어도 예외가 throw되지 않는다.

    : Exists() -> 파일이 있는지 여부를 확인

    : GetAttributes() -> 정규화된 경로에 있는 파일의 FileAttributes를 가져옴

    : GetCreationTime() -> 파일 또는 디렉터리의 만든 날자와 시간을 반환

    : GetLastAccessTime() -> 파일 또는 디렉터리를 마지막으로 액세스한 날짜와 시간을 반환

    : GetLastWriteTime() -> 파일 또는 디렉터리를 마지막으로 쓴 날짜와 시간을 반환

    : Move() -> 파일을 새 위치로 이동하고 파일의 이름을 새로 정할 수 있다.

    : Open() -> 지정된 경로에서 FileStream을 연다.

    : OpenRead() -> 읽기용으로 파일을 연다.

    : OpenText() -> UTF-8로 인코딩된 텍스트 파일을 읽기용으로 Open

    : OpenWrite() -> 쓰기용으로 기존 파일을 연다.

    : SetAttributes() -> 파일의 지정된 FileAttributes를 가져온다.

    : SetCreationTime() -> 파일이 만들어진 날짜와 시간을 설정

    : SetLastAccessTime() -> 파일을 마지막으로 액세스한 날짜와 시간을 설정

    : SetLastWriteTime() -> 파일에 마지막으로 쓴 날짜와 시간을 설정

 

 

4. Directory 클래스

 

  - 기능 : 디렉터리의 생성, 이동, 삭제 등의 기능을 이용할 수 있다.

 

  - Directory 클래스

    : public sealed class Directory

    : 디렉터리 생성 및 삭제

    : 디렉터리 관련 함수 제공

    : 멤버 함수들은 대부분 public static으로 선언되어 있다.

 

 

5. Path 클래스

 

  - Path 클래스

    : public sealed class Path

    : 파일이나 디렉터리의 경로의 확장 및 변경, 수정하는 클래스

    : 멤버들은 대부분 public static으로 선언되어 있다.


출처 : http://blog.naver.com/phoogu?Redirect=Log&logNo=110013802685

반응형
Posted by blueasa
, |

GDI+ 선

Programming/C# / 2010. 8. 3. 17:58

ㅁ  GDI+ 선 다루기

 

 - Graphics클래스에 정의된 렌더링 메소드들의 매개변수로 Pan객체를 넘겨 줌으로써 원하는 선을

그릴 수 있다. (Graphics는 다양한 선을 그리는데 사용하는 메소드를 지원 한다.)

 

※ Graphics 클래스의 선 그리기 메소드

 

 메소드

 설명

 DrawArc  좌표, 너비, 높이의 쌍으로 지정된 타원의 부분을 나타내를 호를 그린다.
 DrawBezier  Point 구조체 네 개로 정의되는 Bezier 스플라인을 그린다.
 DrawDeziers  일련의 Bezier 스플라인을 Point 구조체의 배열에서 그린다.
 DrawClosedCurve  Point 구조체의 배열에 의해 정의되는 닫힌 카디널 스플라인을 그린다.
 DrawCurve  Point 구조체의 지정된 배열을 따라 카디널 스플라인을 그린다.
 DrawEllipse  좌표, 높이, 너비의 쌍으로 지정된 경계 사각형에 의해 정의되는 타원을 그린다.
 DrawLine  좌표 쌍에 의해 지정된 두 개의 점을 연결하는 선을 그린다.
 DrawLines  Point 구조체의 배열을 연결하는 일련의 선 세그먼트를 그린다.
 DrawPath  System.Drawing.Drawing2D 네임스페이스에 정의된 GraphicsPath 객체를 이용해서 경로가 정해진 선/곡선의 집합을 그린다.
 DrawPie  좌표 쌍, 너비, 높이 및 두 개의 방사형 선에 의해 지정된 타원으로 정의된 부채꼴 모양을 그린다.
 DrawPolygon  Point 구조체의 배열에 의해 정의된 다각형을 그린다.
 DrawRectangle  좌표 쌍, 너비 및 높이에 의해 지정된 사각형을 그린다.
 DrawRectangles  Rectangle 구조체에 의해 지정된 일련의 사각형을 그린다.
 DrawString  지정된 위치에 지정된 Brush 및 Font 개체로 지정된 텍스트 문자열을 그린다.

 

아래 코드는 WinForm프로젝트로 알아본 예제 코드 입니다.

 

//////////////////////////////////////////////////////////////////////////////////////////

//이벤트선택: paint 이벤트는컨트롤을다시그려야할때발생하는이벤트이다.

private void Form1_Paint(object sender, PaintEventArgs e)

{

            //Graphics 객체통해서화면에그래픽이미지작업을처리

            Graphics graphics = e.Graphics;

 

            //굵기, 파생색펜을생성

            Pen pen = new Pen(Color.Blue, 10);

 

            //Pens으로부터지정된Pen 객체를얻는다.

            Pen pens = Pens.Firebrick;

           

            //다양한펜을이용해여러형태의선을그린다.

            //1. 원그리기

            graphics.DrawEllipse(pen, 10, 10, 100, 100);

            //2. 선그리기

            graphics.DrawLine(pens, 10, 150, 110, 150);

            //3. 부채꼴그리기

            graphics.DrawPie(Pens.Black, 120, 10, 120, 150, 90, 80);

 

            //4. 보라색대쉬선을이용한도형만들기

            Pen pPen = new Pen(Color.Purple, 5);

            //DashStyle사용하려면using 추가System.Drawing.Drawing2D

            pPen.DashStyle = DashStyle.DashDotDot;

            Point[] dotPoint = new Point[]{

                new Point(150,330),new Point(20,100),

                new Point(30,80), new Point(80,100),

                new Point(50,220)

            };

            graphics.DrawPolygon(pPen, dotPoint);

 

            //5. 사각형안에텍스트넣기

            Rectangle rectangle = new Rectangle(150, 10, 130, 60);

            graphics.DrawRectangle(Pens.Blue, rectangle);

            graphics.DrawString("오호그래픽~이렇게나오는구나~!", new Font("돋움체", 12), Brushes.Red, rectangle);

 

            //6. 폼의가장자리에커스텀DashPattern을이용해선을그리기

            Pen cDashPen = new Pen(Color.BlueViolet, 5);

            float[] cDashes = { 5.0f, 2.0f, 1.0f, 2.0f };

            //길이5인대시, 2인공백,길이1인대시, 2인공백

            cDashPen.DashPattern = cDashes;

            graphics.DrawRectangle(cDashPen, ClientRectangle);

}

//////////////////////////////////////////////////////////////////////////////////////////

위 코드중 DashStyle 속성을 설정하고 있는데..DashStyle열거형의 Dash 스타일은 다음 표와같다.

 

 열거형

 설명

 Custom  사용자 정의의 대쉬 스타일을 나타낸다
 Dash  짧은 선(dash)으로만 이루어진 파선을 나타낸다
 DashDot  짧은 선(dash)과 점(dot)으로 이루어진 일점 쇄선을 나타낸다.
 DashDotDot  짧은 선(dash) 사이에 점(dot)이 두 개가 들어가는 이점 쇄선을 나타낸다.
 Dot  점(dot)으로만 이루어진 점선을 나타낸다.
 Solid  중간에 공백이 없는 일반 직선을 나타낸다.

 

아래는 결과 화면이다.

 

 

 

 - 참고 서적 : C# 게임 프로그래밍 -

[출처] [C# 고급] GDI+ 선 |작성자 happydong

반응형

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

DataSet 및 DataGrid 관련 팁  (0) 2010.08.17
File과 Directory, Path  (0) 2010.08.16
C#의 가변인자 전달  (1) 2010.07.28
도킹패널 예제] 좋은 소스 하나 찾았음.  (0) 2010.07.27
Range select sliderbar(trackbar)  (2) 2010.07.23
Posted by blueasa
, |
반응형

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

File과 Directory, Path  (0) 2010.08.16
GDI+ 선  (2) 2010.08.03
도킹패널 예제] 좋은 소스 하나 찾았음.  (0) 2010.07.27
Range select sliderbar(trackbar)  (2) 2010.07.23
Object sender, EventArgs e 는 무엇인가??  (0) 2010.07.22
Posted by blueasa
, |


라이센스도 MIT 이며

이 도킹예제소스임.  멋지게 만들었는데...

소스가 어렵움 ㅡ.,ㅡ;;
사용자 삽입 이미지

ps : 아참 보다보니 꼭 내가 만든것 처럼 보이네용.


출처는 검색중에 찾았는데 잘 모르겠공..
   소스내에 주석으로 존재하는것을 발견!

만든사람 참 대단행~~!

반응형

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

GDI+ 선  (2) 2010.08.03
C#의 가변인자 전달  (1) 2010.07.28
Range select sliderbar(trackbar)  (2) 2010.07.23
Object sender, EventArgs e 는 무엇인가??  (0) 2010.07.22
TextBox에 엔터 이벤트 넣기  (0) 2010.07.22
Posted by blueasa
, |

sprintf -> _stprintf
atoi -> _tstoi
strlen -> _tcslen
strcpy -> _tcscpy
fprintf -> _ftprintf
strcmp -> _tcscmp

strcpy -> _tcscat

char* 을 TCHAR* 로 변환은 (TCHAR*)_bstr_t(<char*형>);

반응형

'Programming > C/C++' 카테고리의 다른 글

IME 관련  (0) 2010.09.10
TLS (Thread Local Strorage)  (0) 2010.08.30
TCHAR printf  (0) 2010.07.12
A * pA = new B 과 B * pB = new B의 차이점.  (0) 2010.06.21
__super C++ 키워드  (0) 2010.06.03
Posted by blueasa
, |

rangeslider

기존의 sliderbar 혹은 trackbar 라고 부르는 컨트롤의 하나의 값 만을 선택할 수 있었는데요.

저는 어떤 영역(Range)를 선택할 수 있는 컨트롤을 만들었습니다.
슬라이더 영역의 최소값, 최대값을 입력하고 그 값들 안에서 특정 구간의 값을 선택할 수 있습니다.


슬라이더 컨트롤은 아래 첨부된 파일에서 Slider.dll 입니다.


// 아래는 컨트롤 모양, 값을 구성하는 기본값

LineThickness = 5;     // 슬라이더의 회색 표시의 라인 두께
TickFrequency = 10;    // 눈금 표시 단위
TickHeight = 5;        // 눈금 표시 길이

MinValue = 0;          // 슬라이더가 가지는 최소값
MaxValue = 100;        // 슬라이더가 가지는 최대값

RangeFrom = 0;         // 선택된 영역에서의 시작 값
RangeTo = 20;          // 선택된 영역에서의 끝 값

MinRangeSize = 10;     // 영역이 가지는 최소한의 크기
MaxRangeSize = 30;     // 영역이 가지는 최대한의 크기

영역이 가지는 최소값, 최대값을 사용하면 슬라이더의 영역(thumb)의 크기 변경이 제한됩니다.
사용하지 않으려면 MinRangeSize 를 0 으로 , MaxRangeSize 를 MaxValue - MinValue로 하시면 되겠지요.


test


위의 그림처럼 컨트롤을 테스트 할 수 있는 프로젝트를 배포합니다.

본 컨트롤은 상업적인 목적 이외에 자유롭게 사용 가능합니다.



반응형
Posted by blueasa
, |
Link : http://www.codeproject.com/KB/architecture/DesignPatternExampleCS.aspx

Simple examples illustrate Design Pattern

Introduction

Design patterns are some common ideas in writing programs. The whole list and their definitions can be found here. The link has very good descriptions and examples, so I won't repeat the definitions here. I think that the design patterns are not easy to understand, and there are too many examples to remember. In order to apply the design patterns to solve a problem, you would need to understand and remember the patterns so that you could see them in the problem. I couldn't remember even half of the names; I couldn't accurately recite a single pattern definition; and I am not sure whether I fully understand the definitions of the design patterns. However, I have been helped by a simple example which makes the patterns easy to understand and remember. I would like to share it and hope that it can help other people, too.

Background

I took the training from NetObjectives several years ago. I don't remember much of the definitions or principles from the training, but their example sticks in my mind. It is a simple problem but it holds several patterns in the problem.

The example is this: We need to design classes for two Shapes: Rectangle and Circle. We need to draw them on different devices: Console and Printer. The shapes can be moved and expanded. In the future, we might need to support other forms of transformation, such as rotate and distort. After transforming the shapes, we need to be able to undo it. We need to support more complex shapes which are comprised of simpler shapes.

Patterns in this Example

We first abstract the Rectangle and Circle as Shape. If the Shapes know how to draw on Printer and Console, then we would need different versions of Shapes. So, it is better to separate the Shape from the Drawing devices.We also abstract the Console and Printer as Drawing devices. This is actually using Bridge pattern because that it decouples the implementation of Shape and Drawing. In the following snippet, the IShape holds a reference to IDrawing object. Shape has two implementations: Circle and Rectangle. Drawing has two implementations: V1 and V2.

Collapse | Copy Code
/*
IShape------------->IDrawing
 /    \              / \
Circle Rectangle    V1 V2
*/
abstract class IShape
{
 protected IDrawing drawing;
 abstract public void Draw();
}
abstract class IDrawing
{
    abstract public void DrawLine();
 abstract public void DrawCircle();
}
class Circle:IShape
{
 override public void Draw(){drawing.DrawCircle();}
}
class Rectangle:IShape
{
 override public void Draw(){drawing.DrawLine(); drawing.DrawLine();}
}
class V1Drawing:IDrawing
{
 override public void DrawLine(){}
 override public void DrawCircle(){}
}
class V2Drawing:IDrawing
{
 override public void DrawLine(){}
 override public void DrawCircle(){}
}

Suppose that there are fixed number of Shapes, but there will be new types of Transformations. In order to support new types of Transformations, we can use the Visitor pattern to make Shapes class future proof. In the following snippet, the Shape class defines operation interface Accept(ITransform), so that new transform types can operated on shapes without modifying Shape classes.

Collapse | Copy Code
/*
   IShape---------->ITransform
 /    \            / \
Circle Rectangle Move Expand
*/
    abstract class IShape
    {
        abstract public void Accept(ITransform transform);
    }
    abstract class ITransform
    {
        abstract public void TransformCircle(Circle c);
        abstract public void TransformRectangle(Rectangle rect);
    }
    class Circle : IShape
    {
        override public void Accept(ITransform transform)
        {
            transform.TransformCircle(this);
        }
    }
    class Rectangle : IShape
    {
        override public void Accept(ITransform transform)
        {
            transform.TransformRectangle(this);
        }
    }
    class Move : ITransform
    {
        override public void TransformCircle(Circle c) { }
        override public void TransformRectangle(Rectangle rect) { }
    }
    class Expand : ITransform
    {
        override public void TransformCircle(Circle c) { }
        override public void TransformRectangle(Rectangle rect) { }
    }

If we want to undo the transform, we can use Memento pattern, where we can store the state of the Shape object without exposing its internal state.

Collapse | Copy Code
//Memento--->IShape

interface IMemento
{
 void ResetState();
}
class IShape
{
 public abstract IMemento GetMemento();
}

If we have a shape which is comprised of collections of other shapes, we can use Composite pattern so that we may handle the complex shape the same way.

Collapse | Copy Code
/*        IShape
         / | \
    Circle | Rectangle
           |
    CompositeShape 1--->* IShape

*/

class CompositeShape : IShape
{
 List<IShape> list = new List<IShape>();
}

If you call MembewiseClone() on an object, you only get a shallow copy of the object. The book “C# 3.0 Design Patterns” has a solution for DeepCopy. It serializes the object into a MemoryStream, and then Deserializes it back to a cloned object.

Collapse | Copy Code
[Serializable]
class IShape
{
public IShape DeepCopy()
{
 using (MemoryStream m = new MemoryStream())
 {
    BinaryFormatter f = new BinaryFormatter();
    f.Serialize(m, this);
    m.Seek(0, SeekOrigin.Begin);
    IShape ret = (IShape)f.Deserialize(m);
    ret.Drawing = drawing;
    return ret;
 }
}
}

Design Pattern Examples in C# and .NET Libraries

There are many examples in C# and .NET libraries. For example:

Adapter Pattern

Streams are tools to read/write a sequence of bytes. If you need to read/write strings or characters, you would need to create a Reader/Writer class. Fortunately, all the Reader/Writer classes can be constructed from a stream object. So, I think that the Reader/Writer classes are adapters which convert a byte array interface to string/char interface.

Collapse | Copy Code
Reader/Writer-->Stream
BinaryReader/Writer{ReadChars,ReadString}
TextReader/Writer{ReadLine,ReadBlock}
|-StreamReader/Writer
|-StringReader/Writer
Stream{Read(byte[]), Write(byte[], Seek, Position)
|
|-NetworkStream(socket){DataAvailable}
|-FileStream(path){ Lock/Unlock/GetACL,IsAsync}
|-MemoryStream (byte[]){GetBuffer(), WriteTo(stream),ToArray()}

I think "boxing" is also an adapter. It converts a value type into a reference type.

Decorator Pattern

When you need encryption or compression, or need to add a buffer on the network stream, you can use Decorator pattern. The bufferedStream, CryptoStream, and DeflateStream are decorators to other streams. They attach additional functionalities to existing streams without changing the interface of the original streams.

Collapse | Copy Code
Stream
|
|- BufferedStream(stream,buffersize), for network
|- CryptoStream: for encryption
|- DeflateStream: for compression

Flyweight Pattern

To save space, String class holds a reference to an Intern object. So, if two strings have the same literal, they share the same storage space. It uses "sharing" to support a large number of fine grained objects efficiently so that it is using Flyweight pattern.

Collapse | Copy Code
String s3 = String.Intern(s2); 

Object Pool Pattern

Creating threads are expensive. You can call Threadpool.QueueUserWorkitem() which uses thread pool to better use the system resources. So, I think that threadpool is a good example of object pool pattern.

Observer Pattern

Observer pattern defines a one to many dependency so that when one object changes state, all its dependencies are notified. The event in C# is exactly for this purpose. An event can be subscribed:

Collapse | Copy Code
UnhandledExceptionEventHandler handler =
	(object sender, UnhandledExceptionEventArgs v) => {
Console.WriteLine(
  "sender={0}, arg={1}, exception={2}, v.IsTerminating={3}",
  sender, v, v.ExceptionObject, v.IsTerminating);
  };
AppDomain.CurrentDomain.UnhandledException += handler;
throw new Exception("hiii");

To unsubscribe, you just need to call event-=.

Collapse | Copy Code
AppDomain.CurrentDomain.UnhandledException -= handler;

You can also define your own events:

Collapse | Copy Code
static public event EventHandler<EventArgs> breakingNews;
if(breakingNews!=null)
breakingNews("NBC", EventArgs.Empty);

If you don't want to check whether the event is null, just add a dummy subscriber:

Collapse | Copy Code
breakingNews += delegate { }; 

Iterator Pattern

Iterator provides a way to access the elements inside an aggregate object. C# has foreach keyword which makes Iterator really easy. It is hard for me to understand what Enumerable and Enumerator are. It is even more confusing why I have to define GetEnumerator for both IEnumerable and IEnumerable<T>. So, I just try to remember this example:

Collapse | Copy Code
class IntEnumerable:IEnumerable<int>
{
public IEnumerator<int> GetEnumerator()
{
    yield return 1;
    yield return 2;
}
IEnumerator IEnumerable.GetEnumerator()
{
    return this.GetEnumerator();
}
}
//Then you use the iterator like this:
foreach(int i in new IntEnumerable())Console.WriteLine(i);

Singleton Pattern

The simplest way to create a singleton is to use a static variable in C#.

Collapse | Copy Code
class Singleton
{
    private static Singleton instance = new Singleton();
    public static Singleton GetInstance()
    {
        return instance;
    }
}

Some people use the double-checked-lock to create a thread safe lazy initialization singleton. However, it is so subtle to implement that some people consider it as Anti-pattern: [Read this].

Netobjectives has this method which I think is the best way to create a thread safe lazy init singleton. Note that the static constructor disables BeforeFieldInit flag (see this link). The inner class Nested avoids early init when other static fields or methods of Singleton are called.

Collapse | Copy Code
class Singleton
{
    private Singleton() { }
    public static Singleton GetInstance()
    {
        return Nested.instance;
    }
    private class Nested
    {
        internal static Singleton instance = new Singleton();
        //static constructor to prevent beforefieldInit
        // see http://www.yoda.arachsys.com/csharp/beforefieldinit.html
        static Nested() {}
    }
} 

Using the Code

The sample code is written in C# 3.0.

Conclusion

I am sure I missed many patterns and might have misunderstood some in the above examples. If so, please let me know so that they can be corrected.

I have benefited from the examples I got from the training in NetObjectives. I felt that the training is an eye opener and I really learnt a lot. After a couple years, the only thing I still remember is their example about Shape, Drawing, and Transform. If you are not familiar with design patterns, I hope that this example gets you interested in reading Wikipedia or a book, or taking the training from NetObjectives. If you have taken their training or are familiar with design patterns, then the examples might help you quickly refresh your memory of design patterns.
One thing I learned is that if my code has a lot of copy/paste, or has a lot of switch/case statements, then I might need to think about using some design patterns.

I think the idea of design pattern is similar to Database normalization. During database normalization, we break one big table into several smaller tables, so that the total number of rows in tables is much smaller, and modification in one small table won't affect other tables. If we can separate/isolate the concepts in our problem, then we are likely applying the ideas of design pattern already, even if we don't remember the pattern names.

History

  • 23rd February, 2009: Initial post
  • 6th March, 2009: Article updated
    • Fixed a broken link
    • Fixed the snippet compilation errors
    • Removed some samples

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

반응형

'Programming > Design Pattern' 카테고리의 다른 글

C# 디자인패턴  (0) 2010.12.15
Dependency를 관리하는 방법  (0) 2010.10.21
GoF의 디자인패턴  (0) 2010.07.23
FSM - 유한 상태 기계 (Finite State Machine)  (0) 2010.07.09
GoF Design Pattern 요약  (0) 2010.05.31
Posted by blueasa
, |



출처 : 기억안남..;;
반응형

'Programming > Design Pattern' 카테고리의 다른 글

C# 디자인패턴  (0) 2010.12.15
Dependency를 관리하는 방법  (0) 2010.10.21
Design Pattern Examples in C#  (0) 2010.07.23
FSM - 유한 상태 기계 (Finite State Machine)  (0) 2010.07.09
GoF Design Pattern 요약  (0) 2010.05.31
Posted by blueasa
, |