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

카테고리

분류 전체보기 (2351)N
Unity3D (579)N
Programming (473)
Unreal (4)
Gamebryo (56)
Tip & Tech (188)N
협업 (35)N
3DS Max (3)
Game (12)
Utility (117)N
Etc (92)
Link (31)
Portfolio (19)
Subject (90)
iOS,OSX (38)
Android (13)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (1)
Memories (20)
Interest (37)
Thinking (36)
한글 (26)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (19)
Exercise (3)
나만의 맛집 (2)
냥이 (9)
육아 (15)N
Total1,357,367
Today20
Yesterday329
Statistics Graph

달력

« » 2020.1
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

공지사항

태그목록

   public class NumericUpDownTypeEditor : UITypeEditor
    {
        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
        {
            if (context == null || context.Instance == null)
                return base.GetEditStyle(context);
            
            return UITypeEditorEditStyle.DropDown;
        }

        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            IWindowsFormsEditorService editorService;

            if (context == null || context.Instance == null || provider == null)
                return value;

            try
            {
                // get the editor service, just like in windows forms
                editorService = (IWindowsFormsEditorService)
                   provider.GetService(typeof(IWindowsFormsEditorService));

                NumericUpDown nmr = new NumericUpDown();
                nmr.Size = new Size(60, 120);
                nmr.Minimum = 0;
                nmr.Maximum = 200;
                nmr.Increment = 0.01M;         /// 업다운 증가 단위(float이 필요해서 0.01로 했음)
                nmr.DecimalPlaces = 6;        /// 소수 이하 표시할 자리 수.
                nmr.Value = new decimal((float)value);
                editorService.DropDownControl(nmr);

                return (float)nmr.Value;
            }
            finally
            {
                editorService = null;
            }
        }
    }
------------------------------------------------------------------------------------------------------

참조1 :  http://social.msdn.microsoft.com/Forums/da-DK/netfxbcl/thread/370ce9d3-fc44-4cdc-9c76-dd913c9b572f 

참조2 : http://social.msdn.microsoft.com/forums/en-US/winforms/thread/5441df96-5b72-4b99-8033-d467bd700c78

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

PropertyGrid catching mouse events  (1) 2012.02.01
A C# 2008 Advanced Customizable PropertyGrid Control  (0) 2012.01.26
Add NumericUpDown in PropertyGrid  (0) 2012.01.20
Nullable 형식 사용  (0) 2012.01.19
MeasureString(문자열 길이 체크)  (0) 2012.01.17
Convert String To Enum Instance  (0) 2011.12.16
Posted by blueasa

댓글을 달아 주세요

Nullable 형식 사용

Programming/C# / 2012. 1. 19. 11:33
Visual Studio 2005
1명 중 1명이 도움이 되는 것으로 평가 이 항목 평가

nullable 형식을 사용하면 내부 형식의 값을 모두 나타낼 수 있을 뿐만 아니라 null 값을 추가로 나타낼 수 있습니다. nullable 형식은 다음과 같은 두 가지 방법 중 하나로 선언됩니다.

System.Nullable<T> variable

- 또는 -

T? variable

T는 nullable 형식의 내부 형식입니다. T는 struct를 비롯한 임의의 값 형식이 될 수 있지만 참조 형식은 될 수 없습니다.

nullable 형식이 필요한 경우를 예로 들면, true와 false라는 두 가지 값만 갖는 일반적인 부울 변수를 생각해 볼 수 있습니다. 이런 변수에는 "정의되지 않은 상태"를 의미하는 값이 없습니다. 여러 프로그래밍 응용 프로그램에서 변수는 정의되지 않은 상태로 있을 수 있으며, 데이터베이스 상호 작용이 가장 대표적인 예입니다. 예를 들어, 데이터베이스의 필드는 true나 false 값을 포함할 수 있지만 값을 전혀 포함하지 않을 수 있습니다. 마찬가지로, 참조 형식이 초기화되지 않았음을 나타내기 위해 이를 null로 설정할 수 있습니다.

이러한 차이를 처리하기 위해서는 상태 정보를 저장하기 위한 추가 변수 사용, 특수 값 사용 등 별도의 프로그래밍 작업이 필요할 수 있습니다. C#에서 nullable 형식 한정자를 사용하면 정의되지 않은 값을 나타내는 값 형식 변수를 만들 수 있습니다.

nullable 형식의 기준으로는 모든 값 형식을 사용할 수 있습니다. 예를 들면 다음과 같습니다.

int? i = 10;
double? d1 = 3.14;
bool? flag = null;
char? letter = 'a';
int?[] arr = new int?[10];

nullable 형식의 각 인스턴스에는 읽기 전용인 공용 속성이 두 개 있습니다.

  • HasValue

    HasValue는 bool 형식이며, 변수에 null이 아닌 값이 포함되어 있으면 true로 설정됩니다.

  • Value

    Value는 내부 형식과 동일한 형식입니다. HasValue가 true이면 Value에는 의미 있는 값이 포함됩니다. HasValue가 false인 경우에 Value에 액세스하려고 하면InvalidOperationException이 throw됩니다.

이 예제에서는 HasValue 멤버를 사용하여 변수의 값을 표시하려고 하기 전에 변수에 값이 포함되어 있는지 테스트합니다.

int? x = 10;
if (x.HasValue)
{
    System.Console.WriteLine(x.Value);
}
else
{
    System.Console.WriteLine("Undefined");
}

값은 다음과 같은 방법으로도 테스트할 수 있습니다.

int? y = 10;
if (y != null)
{
    System.Console.WriteLine(y.Value);
}
else
{
    System.Console.WriteLine("Undefined");
}

nullable 형식은 Value 속성을 사용하거나 명시적으로 캐스팅하여 일반 형식으로 캐스팅할 수 있습니다. 예를 들면 다음과 같습니다.

int? n = null;

//int m1 = n;      // Will not compile.
int m2 = (int)n;   // Compiles, but will create an exception if x is null.
int m3 = n.Value;  // Compiles, but will create an exception if x is null.

두 데이터 형식 사이에 사용자 정의 변환이 정의되어 있는 경우에는 이러한 데이터 형식의 null 허용 버전에 대해서도 동일한 변환을 사용할 수 있습니다.

nullable 형식의 변수는 다음과 같이 null 키워드를 사용하여 null로 설정할 수 있습니다.

int? n1 = null;

일반 형식에서 nullable 형식으로의 변환은 암시적입니다.

int? n2;
n2 = 10;  // Implicit conversion.

값 형식에 사용되는 미리 정의된 단항 및 이항 연산자와 모든 사용자 정의 연산자는 nullable 형식에도 사용할 수 있습니다. 피연산자가 null이면 이러한 연산자는 null 값을 생성합니다. 그렇지 않으면 연산자는 포함된 값을 사용하여 결과를 계산합니다. 예를 들면 다음과 같습니다.

int? a = 10;
int? b = null;

a++;         // Increment by 1, now a is 11.
a = a * 10;  // Multiply by 10, now a is 110.
a = a + b;   // Add b, now a is null.

nullable 형식과 비교를 수행하는 경우 nullable 형식 중 하나가 null이면 비교 결과는 항상 false입니다. 따라서 비교 결과가 false라고 해서 그 반대 경우가 true라고 단정할 수는 없습니다. 예를 들면 다음과 같습니다.

int? num1 = 10;
int? num2 = null;
if (num1 >= num2)
{
    System.Console.WriteLine("num1 is greater than or equal to num1");
}
else
{
    // num1 is NOT less than num2
}

위의 else 문에서 내린 결론은 유효하지 않습니다. num2가 null이므로 값을 포함하지 않기 때문입니다.

모두 null인 두 nullable 형식을 비교할 경우 결과는 true입니다.

?? 연산자는 null이 허용되지 않는 형식에 nullable 형식을 대입할 때 반환되는 기본값을 정의합니다.

int? c = null;

// d = c, unless c is null, in which case d = -1.
int d = c ?? -1;

이 연산자는 여러 개의 nullable 형식과 함께 사용할 수도 있습니다. 예를 들면 다음과 같습니다.

int? e = null;
int? f = null;

// g = e or f, unless e and f are both null, in which case g = -1.
int g = e ?? f ?? -1;

bool? nullable 형식에는 truefalse 및 null의 세 가지 값이 포함될 수 있습니다. 따라서 iffor 또는 while 같은 조건문에서는 이를 사용할 수 없습니다. 예를 들어, 다음 코드는 컴파일되지 않고 컴파일러 오류 CS0266이 발생합니다.

bool? b = null;
if (b) // Error CS0266.
{
}

이 코드는 null이 조건문의 컨텍스트에서 무엇을 의미하는지 명확하지 않기 때문에 컴파일되지 않습니다. 조건문에 사용하기 위해 nullable 부울을 bool로 명시적으로 캐스팅할 수 있지만 개체의 값이 있고 이 값이 null이면 InvalidOperationException이 throw됩니다. 따라서 bool로 캐스팅하기 전에 HasValue 속성을 확인하는 것이 중요합니다.

nullable 부울은 SQL에 사용되는 부울 변수 형식과 비슷합니다. & 및 | 연산자로 생성되는 결과가 값이 세 개인 SQL 부울 형식과 일관성을 유지할 수 있도록 다음과 같은 미리 정의된 연산자가 제공됩니다.

bool? operator &(bool? x, bool? y)

bool? operator |(bool? x, bool? y)

다음 표에서는 이러한 연산자의 결과를 보여 줍니다.

Xyx&yx|y

True

true

True

true

True

false

False

true

True

null

Null

true

False

true

False

true

False

false

False

false

False

null

False

null

Null

true

Null

true

Null

false

False

null

Null

null

Null

null

Posted by blueasa
TAG nullable, T?

댓글을 달아 주세요


http://msdn.microsoft.com/ko-kr/library/6xe5hazb(v=VS.90) 

 http://chobits.tistory.com/15 

http://hoons.kr/Board.aspx?Name=QACSHAP&Mode=2&BoardIdx=47169&Key=&Value=

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

Add NumericUpDown in PropertyGrid  (0) 2012.01.20
Nullable 형식 사용  (0) 2012.01.19
MeasureString(문자열 길이 체크)  (0) 2012.01.17
Convert String To Enum Instance  (0) 2011.12.16
문자열이 숫자 값을 나타내는지 확인  (0) 2011.12.16
Operator Overloading in C#  (2) 2011.12.05
Posted by blueasa

댓글을 달아 주세요

Summary

Enums are a powerful construction in C# and other programming languages when you are working with finite sets such as fruits, days of the week or colors. Visual Studio's Intellisense is very nice with Enums because it lists all the options for the programmer to choose from. But quite often you want to print enums, compare int values, or serialize an enum--and then you have to do some conversions.The following method may be run in the code-behind file of an ASPX page where you have added a Label control named lblOutput. However, this technique will work in any C# program, not just ASP.NET.

Example: Convert string to Enum instance

public void EnumInstanceFromString()
{
   // The .NET Framework contains an Enum called DayOfWeek.
   // Let's generate some Enum instances from strings.

   DayOfWeek wednesday = 
      (DayOfWeek)Enum.Parse(typeof(DayOfWeek), "Wednesday");
   DayOfWeek sunday = 
      (DayOfWeek)Enum.Parse(typeof(DayOfWeek), "sunday", true);
   DayOfWeek tgif = 
      (DayOfWeek)Enum.Parse(typeof(DayOfWeek), "FRIDAY", true);

   lblOutput.Text = wednesday.ToString() 
      + ".  Int value = " + ((int)wednesday).ToString() + "<br>";
   lblOutput.Text += sunday.ToString() 
      + ".  Int value = " + ((int)sunday).ToString() + "<br>";
   lblOutput.Text += tgif.ToString() 
      + ".  Int value = " + ((int)tgif).ToString() + "<br>";

}
The Enum.Parse method takes two or three arguments. The first is the type of the enum you want to create as output. The second field is the string you want to parse. Without a third input, the case of the input string must match an enum instance or the conversion fails. But the third input indicates whether to ignore case. If true, than wEdNEsDAy will still get converted successfully.

Example: Output

Wednesday. Int value = 3
Sunday. Int value = 0
Friday. Int value = 5

출처 :  http://www.cambiaresearch.com/articles/47/convert-string-to-enum-instance

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

Nullable 형식 사용  (0) 2012.01.19
MeasureString(문자열 길이 체크)  (0) 2012.01.17
Convert String To Enum Instance  (0) 2011.12.16
문자열이 숫자 값을 나타내는지 확인  (0) 2011.12.16
Operator Overloading in C#  (2) 2011.12.05
Force property update in propertygrid  (0) 2011.11.29
Posted by blueasa
TAG enum, string

댓글을 달아 주세요

문자열이 지정한 숫자 형식의 유효한 표현인지 확인하려면 모든 기본 숫자 형식에서 구현되며 DateTime 및 IPAddress 같은 형식에서도 구현되는 정적 TryParse 메서드를 사용합니다. 다음 예제에서는 "108"이 유효한 int인지 확인하는 방법을 보여 줍니다.

  int i = 0; 
  string s = "108";
  bool result = int.TryParse(s, out i); //i now = 108

문자열에 비숫자 문자가 포함되어 있는 경우 또는 숫자 값이 지정한 특정 형식에 비해 너무 크거나 너무 작은 경우 TryParse는 false를 반환하고 out 매개 변수를 0으로 설정합니다. 그렇지 않으면 true를 반환하고 out 매개 변수를 문자열의 숫자 값으로 설정합니다.

참고참고

문자열은 숫자만 포함할 수 있으며 사용할 TryParse 메서드 형식에 아직 유효하지 않을 수 있습니다. 예를 들어 "256"은 byte에 대해서는 유효한 값이 아니지만int에 대해서는 유효한 값입니다. 이때 98.6"은 int에 대해 유효한 값이 아니지만 decimal에 대해서는 유효한 값입니다.

다음 예제에서는 longbyte 및 decimal 값의 문자열 표현을 사용하여 TryParse를 사용하는 방법을 보여 줍니다.

string numString = "1287543"; //"1287543.0" will return false for a long
long number1 = 0;
bool canConvert = long.TryParse(numString, out number1);
if (canConvert == true)
  Console.WriteLine("number1 now = {0}", number1);
else
  Console.WriteLine("numString is not a valid long");

byte number2 = 0;
numString = "255"; // A value of 256 will return false
canConvert = byte.TryParse(numString, out number2);
if (canConvert == true)
  Console.WriteLine("number2 now = {0}", number2);
else
  Console.WriteLine("numString is not a valid byte");

decimal number3 = 0;
numString = "27.3"; //"27" is also a valid decimal
canConvert = decimal.TryParse(numString, out number3);
if (canConvert == true)
  Console.WriteLine("number3 now = {0}", number3);
else
  Console.WriteLine("number3 is not a valid decimal");            


또한 기본 숫자 형식에서는 문자열이 유효한 숫자가 아닌 경우 예외를 throw하는 정적 메서드 Parse를 구현합니다. 숫자가 유효하지 않은 경우 false를 반환하기 때문에 일반적으로 TryParse를 사용하는 것이 더 효과적입니다.

TryParse 또는 Parse를 사용하여 텍스트 상자와 콤보 상자 등의 컨트롤로부터 항상 사용자 입력의 유효성을 검사합니다.



출처 :  http://msdn.microsoft.com/ko-kr/library/bb384043.aspx
Posted by blueasa

댓글을 달아 주세요

Description

The Source code below shows how to use OperatorOverloading in C#. Operator Overloading is pretty useful concept derived from C++ by C#.For eg.

We can have class Matrix which hold 2D array of elements.C# add doest not Allows us to do Addition, Subtraction of matrices using the +,- operator rather We use to write Methods AddMatrix(),SubMatrix() with the use of Operator.

Overloading we make the user to code it: 

M3=M1+M2 where M1 and M2 are matrix objects. 

Some Tips while using Operator overloading: 

  1. While OverLoading a Operator always give public static access specifiers. 

  2. Operator Overloading should return a CLS type and not void. 

  3. Atleast one operand to the operator must be of type UDC [User Defined Class] because we cannot overload a operator with two int operands and perform subtraction for + operator which C# does not allow. 

  4. Relational Operators are overloaded in Pairs only.ie if == is overloaded then So !=. 

  5. Same Operator can be overloaded with different function signature for eg. 
    public static Matrix operator +(Matrix m1,int[,] m2) 



    we can also one more method like this: 
    public static Matrix operator + (Matrix m1,Matrix m2)



    Please find to the code which uses overloading of almost all operators. 

Source Code: 

// Source Code starts
using System; 
class Square
{
private double Side;
//public Constructor if int is passed convert to double and assign to Side
public Square(int s)
{
Console.WriteLine(".ctor with int argument");
Side=(
double)s;

//OverLoaded constructor with double argument
public Square(double s)
{
Console.WriteLine(".ctor with double argument");
Side=s;

//override ToString() method of object class.
public override string ToString()
{
Console.WriteLine("Override object class's string");
return this.Side.ToString();

//Overloading + operator to add 2 square objects and return new square object
public static Square operator + (Square x,Square y)
{
Console.WriteLine("Overloading + with Square,Square");
return new Square(x.Side+y.Side);

//Overloading + operator to add square objects with double side and return new square object
public static Square operator + (Square x,double y)
{
Console.WriteLine("Overloading + with Square,double");
return new Square(x.Side+y);

//Overloading + operator to add square objects with int side and return new square object
//This is not necessary since C# automatically calls +(Square,double)
public static Square operator + (Square x,int y)
{
Console.WriteLine("Overloading + with Square,int");
return x +(double)y;

public static implicit operator Square(double s)
{
Console.WriteLine("Overloading = for Square s5=1.5 assignment");
return new Square(s);

public static implicit operator Square(int s)
{
Console.WriteLine("Overloading = for Square s5=10 assignment");
return new Square((double)s);

//OverLoading == operator
public static bool operator ==(Square x,Square y)
{
Console.WriteLine("Overloading == with Square,Square");
return x.Side==y.Side;
}
//OverLoading != operator
public static bool operator !=(Square x,Square y)
{
Console.WriteLine("Overloading != with Square,Square");
return !(x==y); //This will call to operator == simple way to implement !=

//Always override GetHashCode(),Equals when overloading ==
public override bool Equals(object o)
{
return this==(Square)o;

public override int GetHashCode()
{
return (int)Side;

//OverLoading > operator
public static bool operator >(Square x,Square y)
{
Console.WriteLine("Overloading > with Square,Square");
return x.Side>y.Side;

//OverLoading < operator
public static bool operator <(Square x,Square y)
{
Console.WriteLine("Overloading < with Square,Square");
return x.Side<y.Side;

//OverLoading <= operator
public static bool operator <=(Square x,Square y)
{
Console.WriteLine("Overloading <= with Square,Square");
return (x<y) || (x==y); //Calls to operator == and <

//OverLoading >= operator
public static bool operator >=(Square x,Square y)
{
Console.WriteLine("Overloading >= with Square,Square");
return (x>y) || (x==y); //Calls to operator == and >

//Readonly Property
public double Area
{
get
{
return 2*Side;
}

public static void Main()
{
Square s1=
new Square(10);
Square s2=
new Square(20);
Square s3=s1+s2; 
// This will call operator + (Square,Square)
Console.WriteLine(s3);
Console.WriteLine(s3+15); 
// This will call operator + (Square,int) and then ToString()
Console.WriteLine(s3+1.5);// This will call operator + (Square,double) and then ToString()
s3=10; // This will call operator Square(int)
Console.WriteLine(s3);
Square s4=10;
Console.WriteLine(s1==s4); 
//Calls == operator
Console.WriteLine(s1!=s4); //Calls != operator
Console.WriteLine(s1>s2); //Calls > operator
Console.WriteLine(s1<=s4); //Calls <= operator
}
}
// Source Code End


출처 : http://www.c-sharpcorner.com/UploadFile/prasadh/OperatorOverloading11142005003229AM/OperatorOverloading.aspx

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

Convert String To Enum Instance  (0) 2011.12.16
문자열이 숫자 값을 나타내는지 확인  (0) 2011.12.16
Operator Overloading in C#  (2) 2011.12.05
Force property update in propertygrid  (0) 2011.11.29
is 비교 연산자, as 연산자  (0) 2011.11.29
effective c# - 1  (0) 2011.11.29
Posted by blueasa
TAG operator

댓글을 달아 주세요

  1. 2013.01.05 08:28 C. 탄소  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다. C#에서 연산자 오버로딩을 할 때 static을 사용하는 건,
    연산자를 오버로딩할 때 인자로 적어도 하나 이상의 UDC 인스턴스를 넣기 위함이었을지도 모르겠다는 생각이 드네요..

특정 이벤트에서 변경 이벤트가 발생할 때,
propertyGrid1.Refresh();
실행

테스트를 해 본 바로는 PropertyValueChanged Event가 적당함.

출처 : Mine 



I know this is an OLD thread, but for the next person looking for a response this works quite well for me:

Expand|Select|Wrap|Line Numbers
  1. object Temp = propertyGrid1.SelectedObject;
  2.                 propertyGrid1.SelectedObject = null;
  3.                 propertyGrid1.SelectedObject = Temp;
Feb 26 '10 #4


출처 : http://bytes.com/topic/c-sharp/answers/436382-force-property-update-propertygrid
Posted by blueasa

댓글을 달아 주세요

 is 연산자 : 두 객체가 동일한지 비교하는데 사용, is 연산자는 해당 객체가 is 오른쪽 형식과 호환되는지 확인만 한다. 객체 형식을 변경할 수 는 없다.

  1. char data = 'a';
  2. if(data is char)
  3. System.Console.WriteLine("문자 데이터 입니다.");
  4. else
  5. System.Console.WriteLine("문자 데이터가 아닙니다.");

 

 

as 연산자 : 객체가 호환되지 않으면 null 값을 할당, 호환되면 형식(casting)을 시켜준다. as 연산자는 강제 형변환과 비슷하며 변환시 예외가 발생하면 null을 채운다.

[표현식] as [데이터타입]

 

  1. string obj = data as string;
    if(obj != null)
    {
     ....
    }

 

아래의 형태는 as 연산자가 하는 기능이다.

[표현식] is [데이터타입] ? (데이터타입)[표현식] : (데이터타입) null

 

출처 : http://ocplay.springnote.com/pages/2731066 

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

Operator Overloading in C#  (2) 2011.12.05
Force property update in propertygrid  (0) 2011.11.29
is 비교 연산자, as 연산자  (0) 2011.11.29
effective c# - 1  (0) 2011.11.29
TreeNode Visual C# 도구 설명을 추가하는 방법  (0) 2011.11.21
TreeView에서 Find 함수 사용 방법  (0) 2011.11.20
Posted by blueasa
TAG C# as, C# is, is

댓글을 달아 주세요

effective c# - 1

Programming/C# / 2011. 11. 29. 10:56

C# 코드를 짤 때 좀 더 효율적인 코드를 짜기 위한 방법들을 정리한 포스트이다.
먼저 Code Project의 아래 포스트를 번역한 후 다른 글들도 한번 찾아 봐야겠다.

원본 : http://www.codeproject.com/KB/cs/effectivecspart1.aspx#item1

포스팅한 날짜가 2005년꺼라 꽤 오래된 자료라 현재 버전에서는 어느정도 차이가 있을듯하다.




Item 1 - String의 사이즈를 체크할때는 Length Property를 사용하라.[Performance]

String 비교는 불필요한 overhead를 포함하고 있다. 스트링이 비어 있는지를 체크하는 것이라면

Length properthy를 사용하도록 한다.

 
//NO

if ( str != "")//comparison of two strings {...}

//YES

if ( str.Length > 0) {...}

 

Item 2 - String을 연속적으로 붙일 때에는 StringBuilder 객체를 사용하라.[Performance]

C# string은 변경되지 않는다. string 값이 변경할 때, 아래와 같은 문제들이 야기된다.

  • 필요한양보다 메모리를 추가적으로 더 사용하게 된다.
  • garbage collector가 작업해야 될 일들이 더 생긴다.
  • 실행시 느려지는 코드를 만들게 된다.
 
//NO

String strConcat;
ArrayList arrayOfStrings = new ArrayList();
arrayOfStrings.Add("a"); 
arrayOfStrings.Add("b");
foreach (string s in stringContainer) {
  strConcat += s; 
}

//YES

StringBuilder sbConcat = new StringBuilder ();
foreach (string s in arrayOfStrings ) { 
  sbConcat.append(s);
}

 

Item 3 - 되도록이면 Boxing과 UnBoxing을 피하라[Performance]

BBoxing은 garbage-collected 힙 영역에 value types들을 저장하는데 이용된다.

value type이 box되면 새로운 ojbect가 메모리에 잡히고 생성되어야 한다.

즉, 아래의 두가지 작업이 일어난다.

  - Object 인스턴스를 할당한다.

  - 위 인스턴스에 value type 값을 복사해서 넣는다.

위의 이유로 되도록이면 Boxing을 피하는것이 좋다. ArrayList를 예로 들어보면 struct 키워드를

통해서 ArrayList의 값을 넣을 때 위와 같은 Boxing과 UnBoxing이 일어나게 된다.

 
//NO

struct st { public Int i; }
Arraylist arr = new ArrayList();
for (int i=0 ; i< count; i++) { 
  st s;
  s.i = 4; 
  arr.item.add(st) ; //<- Boxing (Allocating an object instance

                     // + copying the value-type value into that instance)

}
st obj = (st ) arr[0]; //<- Unboxing (casting and copy)


//YES

//Decalre the data type as class.

Class st { public Int i; }

 

Item4 - == 대신 Equal 함수를 사용하라 [Performance]

== 보다 equal 함수를 사용하는것이 좀 더 빠르다.

 

 
string s1= "code";
string s2 = "code1";
//No:

if(s1 == s2){...}
//Yes:

if(s1.Equals(s2)){...}


Item5 - 'foreach' 말고 'for' 를 사용해야 하는 케이스  . [Performance]

'foreach' 랑 'for'  키워드는 일부 비슷한 기능을 한다. - 블록 안에서 루프를 돌면서 기능을 수행

foreach와 for를 사용할때 가장 중요한 차이쯤은 루프문의 증가와 끝에 대해서 따로 작업이 필요 없다는것이다.  또한 foreach는 모든 collection을 사용할 수 있게 만들어졌다. foreach는for의 private한 case에 사용한다고 하기도 한다.

아래 코드를 통해서,  두 루프문이 동일한 결과를 낸다는것을 알 수 있다. 다만 foreach를 사용했을 경우퍼포먼스가 조금 떨어졌다. 좀더 무거운 변수와 큰 array를 사용하면 그 차이가 더 크게 날것이다.

foreach는 for에 비해서 좀더  사용하기 쉽지만 만약 큰 collection을 도는 경우는에는 'for' 를 사용하는것이 퍼포먼스에 좋을 것이다.


Code snippets:

 Collapse
//foreach

int[] arrayOfInts= new int[5];
int sum= 0; 
foreach(int i arrayOfInts) {
  sum+= i; 
}

//for

int[] arrayOfInts= new int[1]; 
int sum= 0;
for(int i = 0; i < arrayOfInts.Length; i++) {
  sum+= arrayOfInts[i]; 
}

Item7 - Prefer the �as� operator instead of direct type casting. [Usage]

The 'as' operator does not throw an exception. In case of bad cast, the return value is null.

Code snippets:

 Collapse
//NO

object o = 1.3; 
try
{
  string str = (string)o; 
} 
catch(InvalidCastException ex){...}

//YES

string str = o as string;
if(null != str){...}

Item8 - Use the 'checked' keyword to avoid overflow. [Usage]

Code snippets:

 Collapse
//NO

short shortNum;
int i = 32768;
shortNum = (short) i; 
// problem after statment excution

// the shortNum variable has an uninitialized value,


//YES

try {
  shortNum = checked((short)i); // solution 

}
catch(OverflowException efx) {}

Item9 - Use the 'is' operator instead of casting. [Usage]

Code snippets:

 Collapse
public class Preson{int nAge;}

//No:

static void main(object o){
  try {
    (Person)o.nAge = 45;
  }
  catch(InvalidCastException ex){...}
}

//Yes:

static void func(object o)
{
  if ( true == (o is Person) )
  {
    (Person)o.nAge = 45;
  }
}

Item10 - Use Explicit interface to 'hide' the implementation of an interface [Usage]

Implementing an interface explicitly 'hides' the interface methods. Visual Studio does not display the interface methods in the intellisense.

Code snippets:

 Collapse
//interface definition

Public interface IChild{
  bool IsHuman();
  void lie();
}

//class definition

Pubic Pinocchio: IChild {
  IChild.IsHuman() //explicit interface implementation

  {
  }
  public void Lie(); //regular interface implementation

}

//using the object

static void main()
{
  // Visual studio will not display

  // the isHuman mwthod in the intellisence.

  Pinocchio o = new Pinocchio();
  ((IChild) o).IsHuman(); // using the IsHuman method explicitly.

  o.Lie();
}

Item11 - Use @ to ease the work with literal paths. [Usage]

Code snippets:

 Collapse
//Old way

String sFilePath = �c:\\a\\b\\c.txt�;

//The C# way

String sFilePath = @�c:\a\b\c.txt�;

Item12 - Make your API assembly CLS Compliant. [Usage]

The CLS-Compliant attribute cause the compiler to check whether your public exposed types in the assembly are CLS-Compliant.

Prefer to define the attribute for the entire assembly, especially for API. The incentive to create a CLS compliant assembly is that any assembly written in one of the .NET aware languages can use your assembly more efficiently because there is no data types interoperability.

Code snippets:

 Collapse
using System; 
[assembly:CLSCompliant(true)]

Item13 - Define destructor and implement IDisposable interface for classes that use native resource directly. [Garbage Collection]

You should define a destructor whenever you use native code in your assembly, i.e., use types that are not managed by the garbage collector. The compiler changes the destructor method to Finalize method (can be seen in the MSIL using the ILDasm.exe).

The Garbage collector marks a class with destructor as Finalized and calls the Finalize method while destructing the object. This behavior guarantees that your release of resources in the destructor will occur.

But, what if you want to release the resources immediately? For this purpose, you should implement the IDisposable interface and call theDispose method when you want to release the object.

Note 1: Do not use destructor if your class does not use native / unmanaged resources. If you do so, you create unnecessary work for the garbage collector.

Note 2: If you implement the IDisposable and a destructor, you should call the Dispose method from the destructor to force the object to release resources immediately.

Code snippets:

 Collapse
~my class {
  if ( true == b) { 
  }
} 

//The MSIL code:

protected override void Finalize() {
  try { 
    if ( true == b) { 
    }
  }finally { base.Finalize();} 
}

Item14 - Avoid the use of GC.Collect. [Garbage Collection]

The GC.Collect method forces garbage collection of all generations.

The performance is hurt during the call to GC.Collect, the application execution is paused. Moreover, the method might cause the promotion of short lived objects to a higher generation, i.e., those object live longer than it should in the first place.

If you must use it in order to reclaim the maximum amount of available memory, use the method only on generation 0.

Code snippets:

 Collapse
//No:

GO.Collect();
//Yes:

GC.Collect(0);

Item15 - Use StructLayout attribute for classes and structs when using COM Interop. [COM Interop]

The attributes cause the compiler to pack the structure in sequential memory so that it can be sent to unmanaged code correctly (unmanaged code that expects a specific layout).

Code snippets:

 Collapse
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)] 
public struct st{
  int i;
  float f;
}

What next?

The part II article, will deal with COM Interop in general, and events between managed and unmanaged code in particular.


출처 : http://www.cyworld.com/mengwi/7680825 

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

Force property update in propertygrid  (0) 2011.11.29
is 비교 연산자, as 연산자  (0) 2011.11.29
effective c# - 1  (0) 2011.11.29
TreeNode Visual C# 도구 설명을 추가하는 방법  (0) 2011.11.21
TreeView에서 Find 함수 사용 방법  (0) 2011.11.20
C# C++ COM Interop  (0) 2011.11.15
Posted by blueasa

댓글을 달아 주세요

이 문서에서는 TreeView 컨트롤 노드의 설명을 추가하는 방법에 대해 설명합니다. 도구 설명 위에 마우스 포인터를 일시 TreeNode에 대한 정보를 표시합니다. TreeView 컨트롤의 ToolTip 속성이 없지만 도구 설명 컨트롤의 도구 설명 기능을 제공할 수 있습니다.

이 문서에 설명되어 있는 예제를 사용하여 요일을 표시하는 TreeView 컨트롤을 사용하여 보여 줍니다. 마우스 포인터가 있는 TreeNodes 중 하나 위에 멈추면 주의 요일을 나타내는 도구 설명이 나타납니다.

요구 사항

다음은 권장되는 하드웨어, 소프트웨어, 네트워크 인프라 및 필요한 서비스 팩의 목록입니다.
  • Microsoft Visual Studio .NET 또는 Microsoft Visual Studio 2005
이 문서에서는 사용자가 다음 항목을 잘 알고 있다고 가정합니다.
  • Visual C# 구문
  • Windows 폼

만들기 및 예제 양식 채우기

  1. Visual C# 에서 새 Windows 프로그램을 만듭니다.
  2. TreeView 컨트롤을 Form1에 추가하십시오.
  3. ToolTip 컨트롤을 Form1에 추가하십시오.

도구 설명을 위해 TreeNodes 추가

  1. Form1 로드 이벤트에 다음 코드를 붙여 넣습니다.
    // Create a root node.
    TreeNode rootNode = treeView1.Nodes.Add("Day of Week");
    
    // Create a series of child nodes and then set the Tag property for each.
    for (int count = 0; count <= 6; count++)
    {
       DayOfWeek day = (DayOfWeek)count;
       TreeNode childNode = rootNode.Nodes.Add(day.ToString());
       childNode.Tag = "This day is " + day.ToString() + ".";
    }
    
    // Expand all of the TreeView nodes.
    rootNode.ExpandAll();
    					
  2. TreeView MouseMove 이벤트에 다음 코드를 붙여 넣습니다.
    // Get the node at the current mouse pointer location.
    TreeNode theNode =  this.treeView1.GetNodeAt(e.X, e.Y);
    
    // Set a ToolTip only if the mouse pointer is actually paused on a node.
    if ((theNode != null))
    {
       // Verify that the tag property is not "null".
       if (theNode.Tag != null)
       {
          // Change the ToolTip only if the pointer moved to a new node.
          if (theNode.Tag.ToString()!=this.toolTip1.GetToolTip(this.treeView1))
          {
             this.toolTip1.SetToolTip(this.treeView1, theNode.Tag.ToString());
          }
       }     
       else
       {
          this.toolTip1.SetToolTip(this.treeView1, "");
       }
    }
    else     // Pointer is not over a node so clear the ToolTip.
    {
       this.toolTip1.SetToolTip(this.treeView1, "");
    }
    					
    노트 해당 코드는 Visual Studio 2005에서 변경해야 합니다. Windows Forms 프로젝트를 만들 때 Visual C# 한 폼을 프로젝트에 기본적으로 추가됩니다. 이 폼은 Form1을 이라고 합니다. 폼을 나타내는 두 파일의 Form1.cs 및 Form1.designer.cs가 지정됩니다. Form1.cs 있는 코드를 작성할 수 있습니다. Windows Forms 디자이너 도구 상자에서 컨트롤을 끌어서 의해 수행된 모든 작업을 구현하는 코드를 기록하는 위치 designer.cs 파일이 없습니다. Windows Forms 디자이너를 Visual C# 2005에 [NULL]에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 방문하십시오.
  3. 저장하고 프로그램을 실행하십시오. 노드 중 하나에서 마우스 포인터를 잠시 두면 도구 설명이 나타납니다.


    출처 : http://support.microsoft.com/kb/322634/ko 

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

is 비교 연산자, as 연산자  (0) 2011.11.29
effective c# - 1  (0) 2011.11.29
TreeNode Visual C# 도구 설명을 추가하는 방법  (0) 2011.11.21
TreeView에서 Find 함수 사용 방법  (0) 2011.11.20
C# C++ COM Interop  (0) 2011.11.15
C#에서 포인터  (0) 2011.11.15
Posted by blueasa

댓글을 달아 주세요