코드를 작성하다 보니
이런경우가 많은거 같더라구요


if(A == "A" || A == "B" || A == "C")
{

}

사실 A라는 변수를 세번 비교를 하는건데...
이게 뭐 크게 불편한건 없지만.
좀 편하게 할수는 없을까 싶어서 생각해보다가
함 만들어봤습니다...(엉망입니다..)

일단 제가 사용한게 string을 비교한거라서
그냥 string에 확장메서드로 만들었구요
(원래는 and나 or에 대해 다 되게 해보려고 했는데 걍 or만 해서..)
orIn이라고 했습니다.(in은 sql에서 사용하는 in 느낌으로......)

public static bool orIn(this string str, List values)
{
      values.RemoveAt(0);
      if (values.Count > 0)
          return str == values[0] || str.orIn(values);
      else
          return false;
}

확장메서드라서 public static이구요..

사용할때는

if (tempStr.Text.orIn(new List {"", "R", "U" }))
{
        //작업
}

이렇게 해줍니다.
파라미터는 List<string>형식이고. (단점은!!) 첫 문자는 필요없는 값이여야 합니다.........

받아온 List<string>의 첫번째 녀석을 계속 없애변서 재귀로 돌리기 땜시...

그리고 또.
제가 알기로는
or가 여러개 있는경우등에서는
첫번째 or에서 값이 true가 나오면 뒤에는 무시한다고 알고 있는데

이 경우에는 끝까지비교를 하기 때문에... 연산이 더 길어져서... 손해가....

그래도
만약 A라는 string변수를 상당히 많은 양의 string값들과 비교할 경우에는 코드양을 조금 줄일수 있지 않을까 싶네요..
(물론.. 모두 or로 연결되어야 합니다...)
by 피요히코~ 2010. 5. 11. 17:04
확장메소드에 대해 써볼께요.
MSDN에는 이렇게 나와있다고 하네요

확장 메서드는 형식으 ㅣ인스턴스 메서드인 것처럼 호출할수 있도록 형식과 연결된 수 있는
정적 메서드 입니다.
이 기능을 사용하면 실제로 기존 형식을 수정하지 않고도 기존 형ㅅ익에 새 메서드를 추가할수 있습니다.

Javascript에서도 이런 기능이 있죠.(Prototype)

C#에서는 IEnumerable<T> interface가 구현된 모든 타입에서 구현이 가능합니다.

간단한 소스를 봐보면요
    public static class MyExtensions
    {
        public static int wordCount(this string str)
        {
            return str.Length;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string s = "Extension Methods";
            Console.WriteLine(s.wordCount().ToString());
        }
    }

 

확장메서드의 가장 큰 장점(?) 은 원래 부터 정의되어 있는 메서드 처럼 사용할수 있다는거죠.
실제로 String에는 wordCount() 라는 메서드가 없잖아요.
근데 그냥 . 찍고 wordCount() 해주면 새로 정의한 메서드가 호출되는거죠.
(사용자가 사용하기가 참 편하겠죠)
차이가 있다면 인텔리센스에서 메서드표시 옆에 화살표가 표시되는것과
이름옆에 (확장)이라고 표시되는거죠.



라인1 부터 7 까지가 확장메서드 입니다.
간단하게 string값의 길이(length)를 반환하는 메서드를 작성했어요(출력값은 17 이에요)

MyExtentions 라는 정적 클래스를 선언하고 그 안에 wordCount라는 메서드를 선언했어요.
인수는 string 객체이며 this 키워드를 붙입니다.
여기서 this는 호출객체를 의미하는 참조자가 아니라 뒤의 클래스에 대한 확장메서드임을 의미하는
지정자에요.  wordCount가 string의 확장메서드라는 의미죠.

코드에서는 인수를 한개만 받았지만 실제로 인수는 제한이 없습니다.
두번째 인수부터는 실제 연산에 필요한 값들을 받으면 되는거죠.

(아무 의미가 없지만. --)string의 length에 특정 숫자를 붙인 int를 받는 메서드를 작성하고 싶으면


     public static class MyExtensions
    {
        public static int wordCount(this string str, int add)
        {
            return str.Length+add;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string s = "Extension Methods";
            Console.WriteLine(s.wordCount(5).ToString());
        }
    }


이렇게 해주면 되죠.(출력값은 17+5 해서 22가 나오겠죠?)

확장메서드는 인스턴스 메서드처럼 사용되지만 소속은 분명히 클래스 외부입니다.
그러므로(당연히) 확장하는 클래스의 숨겨진 멤버들에는 접근을 할수가 없어요.
그래서 확장 메서드로 클래스를 확장한다고 캡슐화를 위한바는것도 아니고.
보안상으로도 별 문제가 없다고 하네요.

by 피요히코~ 2009. 4. 26. 18:45
| 1 |