2010년 3월 28일 일요일

C# Conditional Method

원문 : C# Conditional Method - http://dotnetperls.com

예전 C# 을 처음 배워갈때 누군가 물어 보았었다. C# 에서 조건부 컴파일이 가능하냐고?! 그때 난 "그런 건 없는것 같은데요..." 라고 대답했었다. -_-;;; 없긴 왜 없겠나!!





C# Conditional Method



C++ 에서는 #define 전처리기를 이용하여 조건부로 컴파일 되는 코드를 작성했다. C# 에서도 이와 같은 기법이 존재한다. C# 에서는 conditional method 라고 한다. conditional method 는 #define 정의된 심벌을 포함하고 있을때만 컴파일 된다.

conditional method 를 사용하기 위해 Conditional 어트리 뷰트를 사용해야 한다. Conditional 어트리뷰트는 문자열로 매개변수를 받는다. #define 에 정의한 문자열을 이곳에 사용한다.


Using the Conditional attribute
예제를 보면 쉽게 이해할 수 있다.

#define PERLS
#undef DOT


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

namespace ConditionalMethodDemo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            MethodA();
            MethodB();
            Console.ReadKey();
        }

        [Conditional("PERLS")]        private static void MethodA()
        {
            Console.WriteLine("Method A");
        }

        [Conditional("DOT")]        private static void MethodB()
        {
            Console.WriteLine("Method B");
        }
    }
}


Conditional 어트리뷰트를 사용하기 위해 Using.System.Diagnostics 네임스페이스를 using 시킨다.

using System.Diagnostics;

우선 코드의 제일 윗 부분에 conditional method 를 위해 Conditional 어트리뷰트에 사용할 기호를 정의한다.
#undef 를 사용하면 해당 심벌이 정의되지 않은 상태로 만든다.

#define PERLS
#undef DOT

conditional method 윗 부분에 Conditional 어트리 뷰트를 선언한다.

    [Conditional("PERLS")]
    static void MethodA()
    {
        Console.WriteLine(true);
    }

    [Conditional("DOT")]
    static void MethodB()
    {
        Console.WriteLine(false);
    }

코드에 #define 으로 "PERLS" 가 실행되어 있으면 MethodA 가 실행되고, "DOT" 가 선언되어 있으면 MethodB 가 실행된다.
눈여겨 볼 것은 MethodA(), MethodB() 가 모두 코드에 있지만 #define 에 의해서 선별적으로 실행 된다는게 인상적이다.
실행 결과는 아래와 같다.



cfile22.uf.1667DF3B50AEC2FD077D9D.zip

More conditional attribute information
리턴타입이 void 가 아닌 메소드에는 conditional 어트리뷰트를 사용할 수 없다. 이런 제약조건을 메소드의 인수를 이용해서 간접적으로 해결할 수 도 있다. 즉, 메소드 안에서 저장할 데이터를 파라미터에 저장시키는 것이다.
cf) DEBUG Array - http://www.dotnetperls

2010년 3월 25일 목요일

C# AsEnumerable Method

원문 : http://dotnetperls.com/asenumerable





C# AsEnumerable Method


C# 프로그래밍 언어에서 IEnumerable 인터페이스는 제네릭 인터페이스로 열거 기능을 구현하는 인터페이스다. 제네릭 메서드인 AsEnumerable 메서드는 특정 타입을 IEnumerable 을 구현한 타입으로 변환시켜준다.


Unerstanding AsEnumerable

AsEnumerable 메소드는 확장 메서드(Extension Method) 이다. C# 3.0 에 추가된 문법이다. (처음 이 문법을 볼때 이게 어디 쓰일까 했는데 이제 슬슬 눈에 보이기 시작한다.) System.Linq 네임스페이스를 using 시켜야 사용할 수 있다.

한마디로, IEnumerable 컬렉션이 필요한 곳에 특정 데이터 타입이 IEnumerable 인터페이스를 구현하고 있지 않다면 AsEnumerable 확장 메서드를 이용하여 넘기는 것이다.

아래 예제 코드는 원문 블로그에 있는 예제 인데... array 은 원래 foreach 에 사용할 수 있는데...


using System;
using System.Linq;

class Program
{
    static void Main()
    {
        // Create an array type.
        int[] array = new int[2];
        array[0] = 5;
        array[1] = 6;
        // Call AsEnumerable method.
        var query = array.AsEnumerable();
        foreach (var element in query)
        {
            Console.WriteLine(element);
        }
    }
}


.NET Framework 에서 AsEnumerable 의 구현 코드는 다음과 같다고 한다. 단지 파라미터를 캐스팅하여 리턴시켜주기만 한다.

public static IEnumerable<TSource> AsEnumerable<TSource>(this IEnumerable<TSource> source)
{
    return source;
}

예제 코드에서는 var 타입을 사용하였다. var 타입을 사용함으로써 코드를 깔끔(?!) 하게 만들 수 있다. 저 위치에는 IEnumerable<int> 타입을 명시적으로 사용할수도 있다.

WPF Label

원문 : http://www.c-sharpcorner.com/UploadFile/mahesh/648/

지금 이곳은 연봉 협상의 소용돌이가 몰아치고 있다. 난 아직 협상할 처지가 아니라 지켜보고 있지만
자기 스펙 관리 잘 해야 겠다는 것을 느꼈다. 무섭네..





WPF Label


C# 과 XAML 을 이용하여 WPF 에서 라벨 컨트롤을 어떻게 생성하는지 알아보자.


Creating a Label
XAML 에서 WPF Label 컨트롤은 Label 엘리먼트다.
< Label />

Label 엘리먼트의 WidthHeight 어트리뷰트는 Label 의 너비와 높이를 나타낸다.  Content 프로퍼티는 Label 의 텍스트를 나타낸다. Name 어트리뷰트는 Label 엘리먼트의 이름을 나타낸다. 즉, 컨트롤의 변수 이름이기 때문에 유일한 값을 갖어야 한다.

다음의 코드는 Label 컨트롤을 생성하고 Label 컨트롤의 이름, 높이, 너비, Content 를 설정한다. 또한 텍스트에 사용할 폰트 포멧을 설정한다.

<Label Name="Label1"    Content="Hello! I am Label Control"     Width="200" Height="40"    Canvas.Left="10" Canvas.Top="10"     FontSize="14" FontFamily="Georgia"    FontWeight="Bold"/>




BackgroundForeground 프로퍼티는 Label 컨트롤의 배경색과 전경색을 설정한다. VerticalAlignmentHorizontalAlignment 프로퍼티로 정렬을 설정한다.

<Label Name="Label1"    Content="Hello! I am Label Control"     Width="200" Height="30"    Canvas.Left="10" Canvas.Top="10"     FontSize="14" FontFamily="Georgia"    FontWeight="Bold"     Background="Black"     Foreground="Orange"     VerticalAlignment="Center"     HorizontalAlignment="Center" />





Adding Contents to a Label Control
Label 컨트롤의 Content 프로퍼티는 다른 컨트롤로 채울 수 있다. 아래 코드는  Label 컨트롤의 Content 프로퍼티에 Ellipse 컨트롤로 채웠다. Content 프로퍼티에는 하나의 엘리먼트만 채울 수 있다. 따라서 아래는 StackPanel 을 Conent 프로퍼티에 연결 시키고, StackPanel 이 여러개의 엘리먼트를 갖게 하였다.

<Label Canvas.Left="10" Canvas.Top="50">    <StackPanel Orientation="Horizontal">        <Ellipse Width="100" Height="100" Fill="Red" />        <Ellipse Width="80" Height="80" Fill="Orange" />        <Ellipse Width="60" Height="60" Fill="Yellow" />        <Ellipse Width="40" Height="40" Fill="Green" />        <Ellipse Width="20" Height="20" Fill="Blue" />        <Ellipse Width="15" Height="15" Fill="Indigo" />        <Ellipse Width="10" Height="10" Fill="Violet" />    </StackPanel></Label>





Formatting a Label
BorderBrush 프로퍼티는 Label 의 경계선을 그리기 위한 브러쉬를 설정한다. 아래 코드는 빨간색과 파란색을 조합한 linear gradient 브러쉬를 사용하여 Label 의 경계선 브러쉬를 설정하였다.

<Label.BorderBrush>    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1" >        <GradientStop Color="Blue" Offset="0" />        <GradientStop Color="Red" Offset="1.0" />    </LinearGradientBrush></Label.BorderBrush>

Background 와 Foreground 프로퍼티에 Label 의 경계선 브러쉬를 linear gradient 브러쉬로 설정할 수 있다.

<Label.Background>    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1" >        <GradientStop Color="Blue" Offset="0.1" />        <GradientStop Color="Orange" Offset="0.25" />        <GradientStop Color="Green" Offset="0.75" />        <GradientStop Color="Black" Offset="1.0" />    </LinearGradientBrush></Label.Background><Label.Foreground>    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1" >        <GradientStop Color="Orange" Offset="0.25" />        <GradientStop Color="Green" Offset="1.0" />    </LinearGradientBrush></Label.Foreground>





Setting Image as Background of a Label
Label 의 Background 에 색상 뿐만 아니라 이미지로 설정할 수 있다.

<Label.Background>    <ImageBrush ImageSource="Garden.jpg" /></Label.Background>








2010년 3월 23일 화요일

WPF CheckBox Control

원문 : http://www.c-sharpcorner.com/UploadFile/mahesh/645/

여담...
어떻게 보면 별거 아닌 내용일지 모른다. 하지만 영어 공부, WPF 공부가 될 것으로 믿는다...





WPF CheckBox Control




XAML 과 C# 을 이용하여 WPF CheckBox 를 만들고 사용하는 방법을 알아보자.


Creating a CheckBox
CheckBox 엘리먼트는 XAML 에서 WPF CheckBox 를 나타낸다.
<CheckBox/>

Content 어트리뷰트는 CheckBox 의 텍스트를 나타낸다.
Name 어트리뷰트는 컨트롤의 이름을 나타낸다. 따라서 다른 컨트롤과 구분되는 유일한 값을 가져야 한다.
Foreground 어트리뷰트는 CheckBox 의 텍스트 전경색을 나타낸다.
FontFamily, FontStyle, FontWeight, FontSize, FontStretch 는 Font 와 관련된 어트리뷰트들 이다.

아래 코드 조각은 CheckBox 를 생성하고 CheckBox 컨트롤의 name, content, foreground, font 를 설정한다.

<CheckBox Name="McCheckBox" Foreground="Orange"    Canvas.Left="20" Canvas.Top="10" Content="Check Me"    FontFamily="Georgia" FontSize="20" FontWeight="Bold" ></CheckBox>

출력되는 CheckBox 는 다음과 같다.




IsChecked 프로퍼티는 CheckBox 컨트롤의 상태를 나타낸다. IsThreeState 프로퍼티는 CheckBox 가 2가지 또는 3가지의 상태를 갖는지를 나타낸다. 여기서 말하는 3가지 상태는 checked, unchecked, indeterminate 를 말한다. 아래 코드 조각은 CheckBox 의 IsChecked 와 IsThreeState 프로프티를 설정하는 모습을 보여준다.

<CheckBox Name="McCheckBox"           Canvas.Left="10" Canvas.Top="10"          Content="Check Me"           IsChecked="True" IsThreeState="True" >             </CheckBox>

  checked 상태

 unchecked 상태

  indeterminate 상태  (넌 모냐?!...)


Adding a CheckBox Click Event Handler
CheckBox 엘리먼트의 CheckedUnchecked 어트리뷰트들은 checked, unchecked 이벤트 핸들러를 연결시킬 수 있다. checked 와 unchecked 이벤트들은 CheckBox 상태가 체크 되었거나 체크 해제되었을 때 발생된다. 아래 코드 조각은 이 두가지 이벤트 핸들러를 연결한 모습이다.

<CheckBox Name="McCheckBox"           Canvas.Left="10" Canvas.Top="10"          Content="Check Me"           IsChecked="True" IsThreeState="True"          Checked="McCheckBox_Checked" Unchecked="McCheckBox_Unchecked">            
</
CheckBox>

다음과 같이 이벤트 핸들러가 추가된다.

private void McCheckBox_Checked(object sender, RoutedEventArgs e){}
private
void McCheckBox_Unchecked(object sender, RoutedEventArgs e){}

각 이벤트 발생 시 CheckBox 의 Content 를 변경시켜 주었다.

private void McCheckBox_Checked(object sender, RoutedEventArgs e){    McCheckBox.Content= "Checked";}
private
void McCheckBox_Unchecked(object sender, RoutedEventArgs e){    McCheckBox.Content= "Unchecked";}


Creating a CheckBox Dynamically
아래 코드는 run-time 에 CheckBox 컨트롤을 생성하고 프로퍼티를 설정하는 코드이다.

private void CreateDynamicCheckBox(){    CheckBox chb = new CheckBox();    chb.Content = "Click me";    chb.IsChecked = true;    chb.Foreground = new SolidColorBrush(Colors.Orange);    chb.IsChecked = true;
    LayoutRoot.Children.Add(chb);
}



2010년 3월 15일 월요일

C# File.Replace Method

원문 : C# File.Replace Method







C# File.Replace Method



때때로 하나의 파일의 내용을 다른 파일의 내용으로 교체한 후, 기존의 파일은 삭제해야 할 때가 있다. 비록 흔한 경우여서 각자의 로직을 만들었을지 모르지만, C# 에서는 이러한 경우에 사용할 수 있는 유용한 방법을 제공한다. File.Replace 메소드는 하나의 파일의 내용을 다른 파일의 내용으로 효율적으로 옮겨준다. 또한 기존의 파일을 삭제한다.


Using File.Replace method
테스트 프로그램을 작성해 보자. 테스트 프로그램은 File.WriteAllText 메소드를 사용하여  두개의 로컬 텍스트 파일을 만든다. 절대경로를 사용하지 않았기 때문에 테스트 프로그램의 실행 파일 위치에 생성된다.  그런 다음 3개의 인자(소스 파일 이름, 목적지 파일 이름, 백업 파일 이름)를 주어 File.Replace 메소드를 invoke 한다.


Demo Code
public static void Main(string[] args)
{
       // Write to local file1.
       File.WriteAllText("test1.txt", "test1");

       // Write to local file2.
       File.WriteAllText("test2.txt", "test2");

       // fil1 의 내용을 file2 의 내용으로 교체한다.
       // 또한 원래 file1 의 내용을 가진 file3 이라는 백업 파일을 만든다.

       File.Replace("test2.txt", "test1.txt", "test3.txt");
 }


cfile7.uf.2013983750AEC2F92064FD.zip



test2.txt 파일은 삭제되고, test1.txt 의 백업 파일인 test3.txt 파일이 생성 되었다.


test1.txt 에는 test2.txt 파일의 내용으로 교체되었다.


기존 test1.txt 파일의 백업 파일인 test3.txt 에는 기존 test1.txt 의 내용이 담겨 있다.


Summary
File.Replace 메소드는 하나의 파일에서 다른 파일로 내용을 교체하는 빈번한 메카니즘을 제공한다. 뿐만 아니라 원래 데이터를 백업해주기도 한다. 따라서 여러분이 직접 구현한 메소드 대신에 기본적인 파일 메소드 호출의 조합인 File.Replace 를 이용하는게 유리하다.