사용자 지정 DateTime 형식 문자열

사용자 지정 DateTime 형식 지정자를 사용하여 사용자 지정 DateTime 형식 문자열을 만드는 방법으로 DateTime 개체의 형식이 지정되는 방식을 보다 강력하게 제어할 수 있습니다. 하나 이상의 사용자 지정 형식 지정자를 조합하여 원하는 출력을 제공하는 DateTime 형식 지정 패턴을 생성할 수 있습니다. 실제로 대부분의 표준 DateTime 형식 지정자는 현재 적용이 가능한 DateTimeFormatInfo 클래스에 지정된 형식 지정 패턴의 별칭입니다.

다음 표에서는 사용자 지정 형식 지정자와 해당 지정자가 생성하는 결과를 보여 줍니다. 이 형식 지정자의 출력은 현재 culture와 제어판에 있는 국가별 옵션 설정의 영향을 받습니다

형식 지정
설명

d

해당 월의 현재 날짜를 1에서 31까지의 숫자로 표시합니다. 날짜가 한 자리(1-9)이면 한 자리 수로 표시합니다.

다른 사용자 지정 형식 문자열 없이 'd' 형식 지정자만 사용되면 표준 간단한 날짜 패턴 형식 지정자로 해석됩니다. 'd' 형식 지정자가 다른 사용자 지정 형식 지정자나 '%' 문자와 함께 전달되면 사용자 지정 형식 지정자로 해석됩니다.

dd

해당 월의 현재 날짜를 1에서 31까지의 숫자로 표시합니다. 날짜가 한 자리 수(1-9)이면, 숫자 앞에 0이 옵니다(01-09).

ddd

지정된 DateTime의 날짜를 약식 이름으로 표시합니다. 유효한 특정 형식 공급자(예상 속성으로 IFormatProvider를 구현하는 null이 아닌 개체)가 제공되지 않으면 DateTimeFormat의 AbbreviatedDayNames 속성 및 현재 스레드와 관련된 현재 culture가 사용됩니다. 그렇지 않으면 지정된 형식 공급자의 AbbreviatedDayNames 속성이 사용됩니다.

dddd (및 추가 "d" 문자 사용)

지정된 DateTime의 날짜를 전체 이름으로 표시합니다. 유효한 특정 형식 공급자(예상 속성으로 IFormatProvider를 구현하는 null이 아닌 개체)가 제공되지 않으면 DateTimeFormat의 DayNames 속성 및 현재 스레드와 관련된 현재 culture가 사용됩니다. 그렇지 않으면 지정된 형식 공급자의 DayNames 속성이 사용됩니다.

f

초의 최대 유효 자릿수를 표시합니다.

다른 사용자 지정 형식 문자열 없이 'f' 형식 지정자만 사용되면 전체(자세한 날짜 + 간단한 시간) 형식 지정자로 해석됩니다. 'f' 형식 지정자가 다른 사용자 지정 형식 지정자나 '%' 문자와 함께 전달되면 사용자 지정 형식 지정자로 해석됩니다.

System.DateTime.ParseExact 메서드로 구문 분석할 경우, 사용하는 'f' 형식 지정자의 수는 구문 분석할 시간(초)의 최대 유효 자릿수를 나타냅니다.

ff

초의 최대 유효 자릿수 2개를 표시합니다.

fff

초의 최대 유효 자릿수 3개를 표시합니다.

ffff

초의 최대 유효 자릿수 4개를 표시합니다.

fffff

초의 최대 유효 자릿수 5개를 표시합니다.

ffffff

초의 최대 유효 자릿수 6개를 표시합니다.

fffffff

초의 최대 유효 자릿수 7개를 표시합니다.

F

초의 최대 유효 자릿수를 표시합니다. 숫자가 0이면 아무것도 표시되지 않습니다.

System.DateTime.ParseExact(System.String,System.String,System.IFormatProvider) 메서드로 구문 분석할 경우, 사용하는 'F' 형식 지정자의 수는 구문 분석할 시간(초)의 최대 유효 자릿수를 나타냅니다.

FF

초의 최대 유효 자릿수 2개를 표시합니다. 그러나 뒤에 0이 오거나 두 숫자가 0이면 표시되지 않습니다.

FFF

초의 최대 유효 자릿수 3개를 표시합니다. 그러나 뒤에 0이 오거나 세 숫자가 0이면 표시되지 않습니다.

FFFF

초의 최대 유효 자릿수 4개를 표시합니다. 그러나 뒤에 0이 오거나 네 숫자가 0이면 표시되지 않습니다.

FFFFF

초의 최대 유효 자릿수 5개를 표시합니다. 그러나 뒤에 0이 오거나 다섯 숫자가 0이면 표시되지 않습니다.

FFFFFF

초의 최대 유효 자릿수 6개를 표시합니다. 그러나 뒤에 0이 오거나 여섯 숫자가 0이면 표시되지 않습니다.

FFFFFFF

초의 최대 유효 자릿수 7개를 표시합니다. 그러나 뒤에 0이 오거나 일곱 숫자가 0이면 표시되지 않습니다.

g 또는 gg (및 추가 "g" 문자 사용)

지정된 DateTime의 연대(예: A.D)를 표시합니다. 유효한 특정 형식 공급자(예상 속성으로 IFormatProvider를 구현하는 null이 아닌 개체)가 제공되지 않으면 연대는 DateTimeFormat과 관련된 달력 및 현재 스레드와 관련된 현재 culture를 통해 결정됩니다.

다른 사용자 지정 형식 문자열 없이 'g' 형식 지정자만 사용되면 표준 일반 형식 지정자로 해석됩니다. 'g' 형식 지정자가 다른 사용자 지정 형식 지정자나 '%' 문자와 함께 전달되면 사용자 지정 형식 지정자로 해석됩니다.

h

지정된 DateTime의 시간을 1-12 범위에서 표시합니다. 이때 시간은 자정(12로 표시) 또는 정오(이것도 12로 표시) 이후 경과한 총 시간을 나타냅니다. 이 형식만 사용하면 정오 이전과 이후의 같은 시간을 구별할 수 없습니다. 시간이 한 자리(1-9)이면 한 자리 수로 표시합니다. 시간을 표시할 때는 반올림하지 않습니다. 예를 들어, DateTime이 5:43이면 5를 반환합니다.

hh, hh (및 추가 "h" 문자 사용)

지정된 DateTime의 시간을 1-12 범위에서 표시합니다. 이때 시간은 자정(12로 표시) 또는 정오(이것도 12로 표시) 이후 경과한 총 시간을 나타냅니다. 이 형식만 사용하면 정오 이전과 이후의 같은 시간을 구별할 수 없습니다. 시간이 한 자리 수(1-9)이면 앞에 0이 옵니다(01-09).

H

지정된 DateTime의 시간을 0-23 범위에서 표시합니다. 이때 시간은 자정(0으로 표시) 이후 경과한 총 시간을 나타냅니다. 시간이 한 자리(0-9)이면 한 자리 수로 표시합니다.

HH, HH (및 추가 "H" 문자 사용)

지정된 DateTime의 시간을 0-23 범위에서 표시합니다. 이때 시간은 자정(0으로 표시) 이후 경과한 총 시간을 나타냅니다. 시간이 한 자리 수(0-9)이면 앞에 0이 옵니다(01-09).

m

지정된 DateTime의 분을 0-59 범위에서 표시합니다. 이때 분은 마지막 시간 이후 경과한 총 분을 나타냅니다. 분이 한 자리(0-9)이면 한자리 수로 표시합니다.

다른 사용자 지정 형식 문자열 없이 'm' 형식 지정자만 사용되면 표준 월 일 패턴 형식 지정자로 해석됩니다. 'm' 형식 지정자가 다른 사용자 지정 형식 지정자나 '%' 문자와 함께 전달되면 사용자 지정 형식 지정자로 해석됩니다.

mm, mm (및 추가 "m" 문자 사용)

지정된 DateTime의 분을 0-59 범위에서 표시합니다. 이때 분은 마지막 시간 이후 경과한 총 분을 나타냅니다. 분이 한 자리(1-9)이면 분 앞에 0이 옵니다(01-09).

M

월을 1에서 12 사이의 숫자로 표시합니다. 해당 월이 한 자리(1-9)이면 한 자리 수로 표시합니다.

다른 사용자 지정 형식 문자열 없이 'M' 형식 지정자만 사용되면 표준 월 일 패턴 형식 지정자로 해석됩니다. 'M' 형식 지정자가 다른 사용자 지정 형식 지정자와 함께 전달되면 사용자 지정 형식 지정자로 해석됩니다.

MM

월을 1에서 12 사이의 숫자로 표시합니다. 해당 월이 한 자리(1-9)이면 월 앞에 0이 옵니다(01-09).

MMM

지정된 DateTime의 월을 약식 이름으로 표시합니다. 유효한 특정 형식 공급자(예상 속성으로 IFormatProvider를 구현하는 null이 아닌 개체)가 제공되지 않으면 DateTimeFormat의 AbbreviatedMonthNames 속성 및 현재 스레드와 관련된 현재 culture가 사용됩니다. 그렇지 않으면 지정된 형식 공급자의 AbbreviatedMonthNames 속성이 사용됩니다.

MMMM

지정된 DateTime의 월을 전체 이름으로 표시합니다. 유효한 특정 형식 공급자(예상 속성으로 IFormatProvider를 구현하는 null이 아닌 개체)가 제공되지 않으면 DateTimeFormat의 MonthNames 속성 및 현재 스레드와 관련된 현재 culture가 사용됩니다. 그렇지 않으면 지정된 형식 공급자의 MonthNames 속성이 사용됩니다.

s

지정된 DateTime의 초를 0-59 범위에서 표시합니다. 이때 초는 마지막 분 이후 경과한 전체 초를 나타냅니다. 초가 한 자리(0-9)이면 한자리 수로만 표시합니다.

다른 사용자 지정 형식 문자열 없이 's' 형식 지정자만 사용되면 정렬 가능한 표준 날짜/시간 패턴 형식 지정자로 해석됩니다. 's' 형식 지정자가 다른 사용자 지정 형식 지정자나 '%' 문자와 함께 전달되면 사용자 지정 형식 지정자로 해석됩니다.

ss, ss (및 추가 "s" 문자 사용)

지정된 DateTime의 초를 0-59 범위에서 표시합니다. 이때 초는 마지막 분 이후 경과한 전체 초를 나타냅니다. 초가 한 자리(1-9)이면 초 앞에 0이 옵니다(01-09).

t

지정된 DateTime의 A.M./P.M. 지정자를 첫 문자만 표시합니다. 유효한 특정 형식 공급자(예상 속성으로 IFormatProvider를 구현하는 null이 아닌 개체)가 제공되지 않으면, DateTimeFormat의 AMDesignator 또는 PMDesignator 속성및 현재 스레드와 관련된 현재 culture가 사용됩니다. 그렇지 않으면 지정된 IFormatProviderAMDesignator 또는 PMDesignator 속성이 사용됩니다. 지정된 DateTime의 총 경과 시간이 12 이하이면 AMDesignator가 사용됩니다. 그렇지 않으면 PMDesignator가 사용됩니다.

다른 사용자 지정 형식 문자열 없이 't' 형식 지정자만 사용되면 표준 자세한 시간 패턴 형식 지정자로 해석됩니다. 't' 형식 지정자가 다른 사용자 지정 형식 지정자나 '%' 문자와 함께 전달되면 사용자 지정 형식 지정자로 해석됩니다.

tt, tt (및 추가 "t" 문자 사용)

지정된 DateTime의 A.M./P.M. 지정자를 표시합니다. 유효한 특정 형식 공급자(예상 속성으로 IFormatProvider를 구현하는 null이 아닌 개체)가 제공되지 않으면, DateTimeFormatAMDesignator 또는 PMDesignator 속성 및 현재 스레드와 관련된 현재 culture가 사용됩니다. 그렇지 않으면 지정된 IFormatProviderAMDesignator 또는 PMDesignator 속성이 사용됩니다. 지정된 DateTime의 총 경과 시간이 12 이하이면 AMDesignator가 사용됩니다. 그렇지 않으면 PMDesignator가 사용됩니다.

y

지정된 DateTime의 연도를 최대 두 자리 수로 표시합니다. 연도의 처음 두 자리는 생략합니다. 연도가 한 자리(1-9)이면 한 자리 수로 표시합니다.

다른 사용자 지정 형식 문자열 없이 'y' 형식 지정자만 사용되면 표준 간단한 날짜 패턴 형식 지정자로 해석됩니다. 'y' 형식 지정자가 다른 사용자 지정 형식 지정자나 '%' 문자와 함께 전달되면 사용자 지정 형식 지정자로 해석됩니다.

yy

지정된 DateTime의 연도를 최대 두 자리 수로 표시합니다. 연도의 처음 두 자리는 생략합니다. 연도가 한 자리(1-9)이면 연도 앞에 0이 옵니다(01-09).

yyyy

지정된 DateTime의 연도를 세기와 함께 표시합니다. 연도의 길이가 4자리보다 작으면, 앞에 필요한 만큼 0을 붙여서 연도를 4자리 길이로 표시합니다.

z

시스템의 현재 표준 시간대에 대한 표준 시간대 오프셋을 시간으로만 표시합니다. 오프셋은 항상 그리니치 표준시보다 앞선 시간(+) 또는 그리니치 표준시보다 늦은 시간(-)을 나타내는 선행 기호(0은 "+0"으로 표시)와 함께 표시됩니다. 이 값의 범위는 –12에서 +13까지입니다. 오프셋이 한 자리(0-9)이면 적절한 선행 기호를 붙여 한 자리 수로 표시합니다. 표준 시간대 설정은 +X 또는 –X로 지정되며, X는 GMT와 차이가 나는 시간을 나타냅니다. 표시된 오프셋은 일광 절약 시간제의 영향을 받습니다.

zz

시스템의 현재 표준 시간대에 대한 표준 시간대 오프셋을 시간으로만 표시합니다. 오프셋은 항상 그리니치 표준시보다 앞선 시간(+) 또는 그리니치 표준시보다 늦은 시간(-)을 나타내는 선행 또는 후행 기호(0은 "+00"으로 표시)와 함께 표시됩니다. 이 값의 범위는 –12에서 +13까지입니다. 오프셋이 한 자리(0-9)이면 오프셋 앞에 적절한 선행 기호와 0이 붙습니다(01-09). 표준 시간대 설정은 +X 또는 –X로 지정되며, X는 GMT와 차이가 나는 시간을 나타냅니다. 표시된 오프셋은 일광 절약 시간제의 영향을 받습니다.

zzz, zzz (및 추가 "z" 문자 사용)

시스템의 현재 표준 시간대에 대한 표준 시간대 오프셋을 시간과 분으로 표시합니다. 오프셋은 항상 그리니치 표준시보다 앞선 시간(+) 또는 그리니치 표준시보다 늦은 시간(-)을 나타내는 선행 또는 후행 기호(0은 "+00:00"으로 표시)와 함께 표시됩니다. 이 값의 범위는 –12:00에서 +13:00까지입니다. 오프셋이 한 자리(0-9)이면 오프셋 앞에 적절한 선행 기호와 0이 붙습니다(01-09). 표준 시간대 설정은 +X 또는 –X로 지정되며, X는 GMT와 차이가 나는 시간을 나타냅니다. 표시된 오프셋은 일광 절약 시간제의 영향을 받습니다.

:

시간 구분 기호입니다.

/

날짜 구분 기호입니다.

"

따옴표로 묶은 문자열입니다. 문자열의 리터럴 값을 앞에 이스케이프 문자(/)가 오는 두 따옴표 사이에 표시합니다.

'

따옴표로 묶은 문자열입니다. 문자열의 리터럴 값을 두 개의 " ' " 문자 사이에 표시합니다.

%c

여기서 c는 표준 형식 지정자와 사용자 지정 형식 지정자를 모두 나타내며, 형식 지정자와 연관된 사용자 지정 형식 패턴을 표시합니다.

단일 문자 형태의 형식 지정자만 사용하면 표준 형식 지정자로 해석됩니다. 둘 이상의 문자로 구성되는 형식 지정자만 사용자 지정 형식 지정자로 해석됩니다. 표준 형식 지정자와 사용자 지정 형식 지정자 둘 다로 정의된 지정자의 사용자 지정 형식을 표시하려면 지정자 앞에 % 기호를 붙입니다.

\c

여기서 c는 모든 문자가 가능하며, 이스케이프 문자는 다음 문자를 리터럴로 표시합니다. 이 컨텍스트에서는 이스케이프 문자를 사용하여 이스케이프 시퀀스(예: 새 줄에 해당하는 "\n")를 만들 수 없습니다.

기타 문자

다른 문자는 결과 문자열에 직접 리터럴로 쓰여집니다.

사용자 지정 패턴을 DateTime.ToString에 전달할 때, 이 패턴은 최소 2문자여야 합니다. "d"만 전달할 경우, 모든 한 자리 형식 지정자는 표준으로 해석되므로 공용 언어 런타임에서 이것을 표준 형식 지정자로 해석합니다. "h" 하나만 전달하면 표준 "h" 형식 지정자가 없기 때문에 예외가 throw됩니다. 단일 사용자 정의 형식만 사용하여 형식을 지정하려면 해당 지정자의 앞과 뒤에 공백을 넣습니다. 예를 들어, 형식 문자열 "h "는 사용자 정의 형식 문자열로 해석됩니다.

다음 예제에서는 DateTime에서 사용자 지정의 형식 지정 문자열을 만드는 방법을 설명합니다. 이 예제에서는 현재 culture가 미국 영어(en-US)라고 가정합니다.

예제

DateTime MyDate = new DateTime(2000, 1, 1, 0, 0, 0);
String MyString = MyDate.ToString("dddd - d - MMMM");
// In the U.S. English culture, MyString has the value:
// "Saturday - 1 - January".
MyString = MyDate.ToString("yyyy gg");
// In the U.S. English culture, MyString has the value: "2000 A.D.".

미국형식 (금요일 , 17 , 2007 ) Culture="en-US"

<%# Eval("makedate", "{0:dddd , d , yyyy }") %>

페이지에   Culture="en-US"  를 설정하면  Friday , 17 , 2007

 

 

ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.ko/dv_fxfund/html/98b374e3-0cc2-4c78-ab44-efb671d71984.htm

ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.ko/dv_deploy/html/334380f7-6e28-4ec8-a427-01dea34724e2.htm

설치 후에 프로그램을 자동으로 실행하는 방법
다음 코드를 사용하여 .vbs 파일을 만듭니다.

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run """" & Property("CustomActionData") & """",7,False
Set WshShell = Nothing

설치 프로젝트를 열고 사용자 지정 작업 편집기로 이동합니다.

커밋 노드를 선택하고 마우스 오른쪽 단추를 클릭한 다음 새 사용자 지정 작업을 추가합니다.

파일 시스템을 검색하여 1단계에서 만든 .vbs 파일을 추가합니다.

다음 내용을 추가하여 CustomActionData 속성을 편집합니다. 여기서 YourApp.exe는 시작 응용 프로그램 파일의 이름입니다.

[TARGETDIR] YourApp.exe

위에 방법 처럼 했는데 나는 스크립트 오류가 난다 아~놔

---------------------------------------------------------------------------------------------------------

난 그냥  내방식대로~~~

설치 프로젝트를 열고 사용자 지정 작업 편집기로 이동합니다.

커밋 노드를 선택하고 마우스 오른쪽 단추를 클릭한 다음 새 사용자 지정 작업을 추가합니다.

image

(test.exe는 간단한 어플리케이션 입니다.)

그다음 test.exe를 클릭한다음

image

InstallerClass 를 false 로 지정

끝~

설치후 실행이라고 해야하나? 설치마지막 단계에 프로그램이 실행됩니다

다시 빌드하고 설치프로젝트를 실행시켜보면 설치마직만 단계에서 test.exe가 실행됩니다

데이타 테이블로 데이타리스트, 그리드뷰 채우기

  protected void Page_Load(object sender, EventArgs e)
    {
        DataRow workRow;
        DataTable workTable = new DataTable();
        workTable.Columns.Add("title");
        workTable.Columns.Add("content");
        for (int i = 0; i <= 5; i++)
        {
            workRow = workTable.NewRow();
            workRow[0] = i;
            workRow[1] = "CustName" + i.ToString();
            workTable.Rows.Add(workRow);
        }

        this.DataListTemp.DataSource = workTable;
        DataListTemp.DataBind();
    }

【property】 프로퍼티

오브젝트 지향 프로그래밍에 쓰여지는 오브젝트가 보유하고 있는 성질을 나타낸 데이터이다.

예를 들어, 영상 데이터 오브젝트이면 높이나 폭 등의 데이터를 프로퍼티로서 가지고 있다.

구체적으로 어떠한 프로퍼티를 가지고 있는지는 오브젝트에 따라 다르며, 오브젝트의 개발자가 오브젝트의 성질에 따라서 설정한다. 프로퍼티 값에는 변경 할 수 없는 것과 변경 가능한 것이 있으며, 변경 가능한 프로퍼티는 같은 오브젝트에 포함되는 메소드를 사용하여 변경할 수 있다.

복사 생성자는 무엇인가?
말 그대로 복사가 일어날 때 호출되는 생성자이다.

일부 언어와는 달리 C#에서는 복사 생성자를 제공하지 않습니다. 새 개체를 만들고 기존 개체에서 값을 복사하려면 적절한 메서드를 직접 작성해야 합니다.

class Person

{

private string name;

private int age;

// Copy constructor.

public Person(Person previousPerson)

{

name = previousPerson.name;

age = previousPerson.age;

}

// Instance constructor.

public Person(string name, int age)

{

this.name = name;

this.age = age;

}

// Get accessor.

public string Details

{

get

{

return name + " is " + age.ToString();

}

}

}

class TestPerson

{

static void Main()

{

// Create a new person object.

Person person1 = new Person("George", 40);

// Create another new object, copying person.

Person person2 = new Person(person1);

Console.WriteLine(person2.Details);

// Keep the console window open in debug mode.

Console.WriteLine("Press any key to exit.");

Console.ReadKey();

}

}

// Output: George is 40

정적 생성자

전용 생성자는 특수 인스턴스 생성자입니다. 이것은 정적 멤버만 포함하는 클래스에서 일반적으로 사용됩니다. 클래스에 전용 생성자만 한 개 이상 있고 공용 생성자는 없을 경우 중첩 클래스를 제외한 다른 클래스는 이 클래스의 인스턴스를 만들 수 없습니다. 예를 들면 다음과 같습니다.

class SimpleClass

{

// Static variable that must be initialized at run time.

static readonly long baseline;

// Static constructor is called at most one time, before any

// instance constructor is invoked or member is accessed.

static SimpleClass()

{

baseline = DateTime.Now.Ticks; //초기에 세팅

}

}

인스턴스 생성자

인스턴스 생성자는 인스턴스를 만들고 초기화하는 데 사용됩니다. 클래스 생성자는 다음 예제처럼 새 개체를 만들 때 호출됩니다.

class CoOrds

{

public int x, y;

// constructor

public CoOrds()

{

x = 0;

y = 0;

}

}

전용 생성자

전용 생성자는 특수 인스턴스 생성자입니다. 이것은 정적 멤버만 포함하는 클래스에서 일반적으로 사용됩니다. 클래스에 전용 생성자만 한 개 이상 있고 공용 생성자는 없을 경우 중첩 클래스를 제외한 다른 클래스는 이 클래스의 인스턴스를 만들 수 없습니다. 예를 들면 다음과 같습니다.

public class Counter

{

private Counter() { }

public static int currentCount;

public static int IncrementCount()

{

return ++currentCount;

}

}

class TestCounter

{

static void Main()

{

// If you uncomment the following statement, it will generate

// an error because the constructor is inaccessible:

// Counter aCounter = new Counter(); // Error

Counter.currentCount = 100;

Counter.IncrementCount();

Console.WriteLine("New count: {0}", Counter.currentCount);

// Keep the console window open in debug mode.

Console.WriteLine("Press any key to exit.");

Console.ReadKey();

}

}

// Output: New count: 101

인덱스로 액세스할 수 있는 강력한 형식의 개체 목록을 나타냅니다. 목록의 검색, 정렬 및 조작에 사용할 수 있는 메서드를 제공합니다.

 

List<(Of <(T>)>) 클래스는 ArrayList 클래스의 제네릭 형태에 해당합니다. 이 클래스는 필요에 따라 크기가 동적으로 증가하는 배열을 사용하여 IList<(Of <(T>)>) 제네릭 인터페이스를 구현합니다.

List<(Of <(T>)>) 클래스는 같음 비교자와 순서 비교자를 모두 사용합니다.

  • Contains, IndexOf, LastIndexOfRemove와 같은 메서드는 목록 요소에 대해 같음 비교자를 사용합니다. T 형식의 기본 같음 비교자는 다음과 같이 결정됩니다. T 형식이 IEquatable<(Of <(T>)>) 제네릭 인터페이스를 구현하면 같음 비교자가 해당 인터페이스의 Equals(T) 메서드이고, 그렇지 않으면 기본 같음 비교자가 Object..::.Equals(Object)입니다.

  • BinarySearchSort와 같은 메서드는 목록 요소에 대해 순서 비교자를 사용합니다. T 형식의 기본 비교자는 다음과 같이 결정됩니다. T 형식이 IComparable<(Of <(T>)>) 제네릭 인터페이스를 구현하면 기본 비교자가 해당 인터페이스의 CompareTo(T) 메서드이고, T 형식이 제네릭이 아닌 IComparable 인터페이스를 구현하면 기본 비교자가 해당 인터페이스의 CompareTo(Object) 메서드입니다. T 형식이 두 인터페이스 중 하나를 구현하지 않으면 기본 비교자가 없으므로 비교자나 비교 대리자가 명시적으로 제공되어야 합니다

 

성능 고려 사항

비슷한 기능을 가진 List<(Of <(T>)>) 클래스와 ArrayList 클래스 중에서 사용할 것을 결정할 때 List<(Of <(T>)>) 클래스가 대부분의 경우 성능이 좋으며 형식이 안전한 것을 고려합니다. 참조 형식이 List<(Of <(T>)>) 클래스의 T 형식에 사용되는 경우 두 클래스의 동작은 동일합니다. 그러나 값 형식이 T 형식에 사용되는 경우에는 구현과 boxing 문제를 고려해야 합니다.

값 형식이 T 형식에 사용되는 경우에는 컴파일러에서 해당 값 형식에 특정한 List<(Of <(T>)>) 클래스의 구현을 생성합니다. 즉, List<(Of <(T>)>) 개체의 목록 요소를 boxing하지 않아도 요소를 사용할 수 있으며, 500개 정도의 목록 요소가 만들어진 후 boxing하지 않는 목록 요소를 저장한 메모리가 클래스 구현을 생성하는 데 사용된 메모리보다 큽니다.

 

http://msdn.microsoft.com/ko-kr/library/yz2be5wk.aspx

boxing은 값 형식을 object 형식 또는 이 값 형식에서 구현된 임의의 인터페이스 형식으로 변환하는 프로세스입니다.

CLR은 값 형식을 boxing할 때 값을 System.Object 내부에 래핑하고 관리되는 힙에 저장합니다. unboxing하면 개체에서 값 형식이 추출됩니다. 다음 예제에서는 정수 변수 i를 boxing하고 개체 o에 할당합니다.

힙과 스택

값(value) 형은 스택(STACK) 이라는 메모리공간에 생성 참조(Reference Type)형은 힙(Heap)이라는 메모리공간에 생성

 

Stack 클래스

제네릭이 아닌 간단한 후입선출(LIFO) 개체 컬렉션을 나타냅니다.

 

 

Reference Type은 보통 말하는 객체생성할때 사용

value 타입은 할당된 바이트와 자신을 변수로 가지고 있는 객체에 대한 주소만 가지고 있음

 

 

int i = 123; object o = (object)i; // boxing

그런 다음 o 개체를 unboxing하고 정수 변수 i에 할당할 수 있습니다.

o = 123; i = (int)o; // unboxing

 

boxing

은 가비지 수집되는 힙에 값 형식을 저장하는 데 사용됩니다. boxing은 값 형식을 object 형식 또는 이 값 형식에서 구현된 임의의 인터페이스 형식으로 변환하는 암시적 변환입니다. 값 형식을 boxing하면 힙에 개체 인스턴스가 할당되고 값이 새 개체에 복사됩니다.

다음과 같이 값 형식 변수를 선언합니다.

int i = 123;

 

다음 문에서는 변수 i에 암시적으로 boxing 연산을 적용합니다.

object o = i; // Implicit boxing

Boxing 변환

BoxingConversion 그래픽

다음 예제에서와 같이 명시적으로 boxing을 수행할 수도 있지만 명시적 boxing이 반드시 필요한 것은 아닙니다

 

 

예제

class TestBoxing
{
    static void Main()
    {
        int i = 123;
        object o = i;  // Implicit boxing

        i = 456;  // Change the contents of i

        System.Console.WriteLine("The value-type value = {0}", i);
        System.Console.WriteLine("The object-type value = {0}", o);
    }
}
/* Output:
    The value-type value = 456
    The object-type value = 123
*/

 

다음 문은 boxing 및 unboxing 연산을 모두 보여 줍니다.

int i = 123;      // a value type
object o = i;     // boxing
int j = (int)o;  // unboxing

 

다음 그림에서는 이전 문의 결과를 보여 줍니다.

Unboxing 변환

UnBoxing 변환 그래픽

.NET Framework Client Profile은 전체 .NET Framework 3.5 SP1에서 클라이언트 응용 프로그램을 대상으로 하는 부분 집합입니다. WPF(Windows Presentation Foundation), Windows Forms, WCF(Windows Communication Foundation) 및 ClickOnce 기능의 효율적인 부분 집합이 제공됩니다. 이를 통해 .NET Framework Client Profile을 대상으로 하는 WPF, Windows Forms, WCF 및 콘솔 응용 프로그램을 빠르게 배포할 수 있습니다.

 

image

sku 특성 이름에는 대/소문자가 구분됩니다. sku 특성이 없거나 값이 "client" 이외의 값으로 설정되어 있으면 런타임에서 응용 프로그램이 .NET Framework Client Profile 응용 프로그램이 아닌 것으로 간주합니다.

주 버전 번호가 같은 구성 파일에 여러 <supportedRuntime> 요소가 있는 경우

  • 및 하나 이상의 요소에 sku="client"가 있는 경우 응용 프로그램은 지정된 버전의 .NET Framework Client Profile을 대상으로 실행됩니다.

  • sku="client"가 있는 요소가 없으면 응용 프로그램은 지정된 전체 버전의 .NET Framework에서만 실행됩니다.

http://support.microsoft.com/kb/816169

 

이 문서에서는 Windows 서비스 응용 프로그램(이전에는 "NT 서비스"라 했음)을 위한 설치 프로젝트를 만드는 방법을 설명합니다. Windows 서비스 응용 프로그램을 위한 설치 프로젝트를 만들려면 먼저 응용 프로그램 로그에 항목을 기록하는 간단한 Windows 서비스 프로젝트가 들어 있는 솔루션을 만들어야 합니다. 그런 다음 설치 프로젝트를 솔루션에 추가하여 Window 서비스를 설치합니다. 마지막으로 Microsoft Visual Studio .NET 또는 Microsoft Visual Studio 2005 서버 탐색기에서 서비스를 시작합니다.

위로 가기

요구 사항
다음은 권장되는 하드웨어, 소프트웨어, 네트워크 인프라 및 필요한 서비스 팩 목록입니다.
  • Microsoft .NET Framework가 설치된 Microsoft Windows 2000 Professional, Microsoft Windows Server 2003, Microsoft Windows 2000 Server, Microsoft Windows XP Professional 또는 Microsoft Windows XP Server
  • Microsoft Visual Studio .NET Enterprise, Microsoft Visual Studio .NET Enterprise Architect 또는 Microsoft Visual Studio 2005
이 문서에서는 사용자가 Windows 서비스에 대해 잘 알고 있는 것으로 가정합니다. Windows 서비스에 대해 잘 모르는 경우 먼저 이 문서의 "참조" 절을 참조하십시오.
또한 이 문서에서는 이 서비스를 설치하고 실행하기 위해 사용하는 사용자 계정에 서비스를 설치하고 시작하는 데 필요한 권한과 이벤트 로그에 액세스하는 데 필요한 권한이 있다고 가정합니다.

위로 가기

Windows 서비스를 위한 설치 프로젝트 만들기
이 절에서는 Windows 서비스 프로젝트를 만들고 컴파일된 설치 프로젝트를 사용하여 Windows 서비스를 설치하는 방법을 설명합니다.
Windows 서비스 프로젝트 만들기
  1. Microsoft Visual Studio .NET 또는 Microsoft Visual Studio 2005를 시작합니다.
  2. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 누릅니다.
  3. 프로젝트 형식에서 Visual C# 프로젝트를 누른 다음 템플릿에서 Windows 서비스를 누릅니다.
    참고 Visual Studio 2005의 경우 프로젝트 형식에서 Visual C#을 확장하고 Windows를 누른 다음 템플릿에서 Windows 서비스를 누르십시오.
  4. 이름 입력란에 LogWriterService를 입력한 다음 위치 입력란에 C:\를 입력합니다. 확인을 누릅니다.
  5. 솔루션 탐색기에서 Service1.cs를 마우스 오른쪽 단추로 누른 다음 코드 보기를 누릅니다.
  6. OnStart 이벤트 처리기에서 설명을 다음 코드로 대체합니다.

    EventLog.WriteEntry("My simple service started.");

  7. 솔루션 탐색기에서 Service1.cs를 두 번 누릅니다.
  8. 코드 편집기 창에서 디자인 뷰를 마우스 오른쪽 단추로 누른 다음 속성을 누릅니다.
  9. 속성 창에서 설치 관리자 추가 링크를 누릅니다.
  10. ServiceInstaller1에 대한 속성 창에서 ServiceName 속성을 Service1로 변경합니다.
  11. 코드 편집기 창의 디자인 뷰에서 ServiceProcessInstaller1을 누릅니다.
  12. 속성 창에서 Account 속성을 LocalSystem으로 변경합니다. LocalServiceNetworkService 값은 Microsoft Windows XP에서만 사용할 수 있습니다.
컴파일된 설치 프로젝트를 사용하여 Windows 서비스 설치
앞의 절에 나와 있는 단계를 완료하여 Windows 서비스 프로젝트를 구성한 후 서비스 응용 프로그램을 설치할 수 있도록 서비스 응용 프로그램을 패키지하는 배포 프로젝트를 추가하려면 다음과 같이 하십시오.
  1. LogWriterService 프로젝트에 새 프로젝트를 추가합니다. 이렇게 하려면 다음과 같이 하십시오.
    1. 솔루션 탐색기에서 'LogWriterService' 솔루션(프로젝트: 1)을 마우스 오른쪽 단추로 누르고 추가를 가리킨 다음 새 프로젝트를 누릅니다.
    2. 프로젝트 형식에서 설치 및 배포 프로젝트를 누른 다음 템플릿에서 설치 프로젝트를 누릅니다.
    3. 이름 입력란에 ServiceSetup을 입력합니다.
    4. 위치 입력란에 C:\를 입력한 다음 확인을 누릅니다.
  2. 배포 프로젝트에 패키지할 내용을 지시합니다. 이렇게 하려면 다음과 같이 하십시오.
    1. 솔루션 탐색기에서 ServiceSetup을 마우스 오른쪽 단추로 누르고 추가를 가리킨 다음 프로젝트 출력을 누릅니다.
    2. 프로젝트 출력 그룹 추가 대화 상자의 프로젝트 상자에서 LogWriterService를 누릅니다.
    3. 기본 출력을 누른 다음 확인을 누릅니다.
  3. 올바른 설치를 위해 기본 출력만 추가합니다. 사용자 지정 작업을 추가하려면 다음과 같이 하십시오.
    1. 솔루션 탐색기에서 ServiceSetup을 마우스 오른쪽 단추로 누르고 보기를 가리킨 다음 사용자 지정 작업을 누릅니다.
    2. 사용자 지정 작업을 마우스 오른쪽 단추로 누른 다음 사용자 지정 작업 추가를 누릅니다.
    3. 응용 프로그램 폴더를 누른 다음 확인을 누릅니다.
    4. LogWriterService의 기본 출력(활성)을 누른 다음 확인을 누릅니다.
      기본 출력설치, 커밋, 롤백제거에 나타나는지 확인합니다.
  4. 설치 프로젝트는 기본적으로 빌드 구성에 포함되지 않습니다. 솔루션을 빌드하려면 다음 방법 중 하나를 사용하십시오.
    • 방법 1
      1. LogWriterService를 마우스 오른쪽 단추로 누른 다음 빌드를 누릅니다.
      2. ServiceSetup을 마우스 오른쪽 단추로 누른 다음 빌드를 누릅니다.
    • 방법 2
      1. 빌드 메뉴에서 구성 관리자를 눌러 전체 솔루션을 빌드합니다.
      2. ServiceSetup에 대해 빌드 확인란을 선택합니다.
      3. F7 키를 눌러 전체 솔루션을 빌드합니다. 솔루션이 빌드되면 서비스에 사용할 수 있는 전체 설치 패키지가 만들어진 것입니다.
  5. 새로 빌드한 서비스를 설치하려면 ServiceSetup을 마우스 오른쪽 단추로 누른 다음 설치를 누릅니다.
  6. ServiceSetup 대화 상자에서 다음을 차례로 세 번 누릅니다. 서비스가 설치되는 동안 진행률 표시기가 나타납니다.
  7. 서비스가 설치되면 닫기를 누릅니다.

위로 가기

전체 코드 예제
Service1.cs

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;

namespace LogWriterService
{
	public class Service1 : System.ServiceProcess.ServiceBase
	{
		/// <summary> 
		/// Required designer variable.
		/// </summary>
		private System.ComponentModel.Container components = null;

		public Service1()
		{
			// The Windows.Forms Component Designer must have this call.
			InitializeComponent();

			// TODO: Add any initialization after the InitComponent call
		}

		// The main entry point for the process
		static void Main()
		{
			System.ServiceProcess.ServiceBase[] ServicesToRun;
	
			// More than one user service may run in the same process. To add
			// another service to this process, change the following line to
			// create a second service object. For example,
			//
			//   ServicesToRun = New System.ServiceProcess.ServiceBase[] {new Service1(), new MySecondUserService()};
			//
			ServicesToRun = new System.ServiceProcess.ServiceBase[] { new Service1() };

			System.ServiceProcess.ServiceBase.Run(ServicesToRun);
		}

		/// <summary> 
		/// Required method for Designer support - do not modify 
		/// the contents of this method with the code editor.
		/// </summary>
		private void InitializeComponent()
		{
			components = new System.ComponentModel.Container();
			this.ServiceName = "Service1";
		}

		/// <summary>
		/// Clean up any resources that are being used.
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		/// <summary>
		/// Set things in motion so your service can do its work.
		/// </summary>
		protected override void OnStart(string[] args)
		{
			EventLog.WriteEntry("My simple service started.");
		}
 
		/// <summary>
		/// Stop this service.
		/// </summary>
		protected override void OnStop()
		{
			// TODO: Add code here to perform any tear-down necessary to stop your service.
		}
	}
}

위로 가기

작동 여부 확인
  1. 제어판에서 관리 도구를 두 번 누른 다음 서비스를 두 번 누릅니다.
  2. Service1을 마우스 오른쪽 단추로 누른 다음 시작을 누릅니다.
  3. 다음 방법 중 하나를 사용하여 이벤트 로그에 이벤트가 기록되었는지 확인합니다.
    • 방법 1
      1. 제어판에서 관리 도구를 두 번 누른 다음 이벤트 뷰어를 두 번 누릅니다.
      2. 왼쪽 창에서 응용 프로그램 로그를 누른 다음 오른쪽 창에서 해당 서비스의 이벤트 로그를 찾습니다.
    • 방법 2
      1. 서버 탐색기에서 서버, ComputerName, 이벤트 로그, 응용 프로그램Service1을 차례로 확장합니다. Service1은 서비스 자체가 아닌 클래스 이름입니다. 따라서 응용 프로그램 이름으로 Service1이 사용됩니다. 이름을 사용자 지정하는 방법은 이 문서에서 설명하지 않습니다.
      2. 커서를 로그 항목 위로 이동합니다. 맨 위에서 두 번째 항목이 "My simple service started"로 표시됩니다.

위로 가기

문제 해결
Framework SDK 설명서에 다음과 같은 내용이 있습니다.

프로젝트가 제대로 작동하려면 서비스 응용 프로그램 프로젝트에서 생성한 컴파일된 실행 파일이 서버에 설치되어 있어야 합니다. 서비스 응용 프로그램은 F5 또는 F11 키를 눌러 디버깅하거나 실행할 수 없으며 서비스를 즉시 실행하거나 서비스의 코드를 한 단계씩 실행할 수 없습니다. 대신 서비스를 설치하고 시작한 다음 서비스의 프로세스에 디버거를 연결해야 합니다.

자세한 내용은 다음 MSDN(Microsoft Developer Network) 웹 사이트를 참조하십시오.

Windows 서비스 응용 프로그램 디버깅
http://msdn2.microsoft.com/en-us/library/aa984342(VS.71).aspx (http://msdn2.microsoft.com/en-us/library/aa984342(VS.71).aspx) (영문)

base 키워드는 다음과 같이 파생 클래스에서 기본 클래스의 멤버에 액세스하는 데 사용됩니다.

  • 다른 메서드로 재정의된 기본 클래스의 메서드를 호출합니다.

  • 파생 클래스의 인스턴스를 만들 때 호출해야 하는 기본 클래스 생성자를 지정합니다.

생성자, 인스턴스 메서드 또는 인스턴스 속성 접근자에서만 기본 클래스에 액세스할 수 있습니다.

정적 메서드 내에서는 base 키워드를 사용할 수 없습니다

*정적 및 인스턴스 메서드

메서드 선언에 static 한정자가 있는 경우 해당 메서드를 정적 메서드라고 합니다. static 한정자가 없으면 인스턴스 메서드라고 합니다.

정적 메서드는 특정 인스턴스에서는 작동되지 않으므로, 정적 메서드에서 this를 참조하면 컴파일 타임 오류가 발생합니다.

--------------------------------------------------------------------------
using System;
public class BaseClass
{
    int num;

    public BaseClass()
    {
        Console.WriteLine("in BaseClass()");
    }

    public BaseClass(int i)
    {
        num = i;
        Console.WriteLine("in BaseClass(int i)");
    }

    public int GetNum()
    {
        return num;
    }
}

public class DerivedClass : BaseClass //BaseClass클래스를 상속받습니다.
{
    // This constructor will call BaseClass.BaseClass()
    public DerivedClass() : base()
    {
    }

    // This constructor will call BaseClass.BaseClass(int i)
    public DerivedClass(int i) : base(i)
    {
    } 
    static void Main()
    {
        DerivedClass md = new DerivedClass();   //Console.WriteLine("in BaseClass()");
        DerivedClass md1 = new DerivedClass(1); //Console.WriteLine("in BaseClass(int i)");


    }
}

app.config

<?xml version="1.0" encoding="utf-8" ?>


<configuration>
  <configSections>
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="MarinerERP.Server.Host.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    </sectionGroup>
  </configSections>


  <connectionStrings>
    <add name=”dbconnection" connectionString="Data Source=SERVER;Initial Catalog=디비" providerName="System.Data.SqlClient"/>
    </connectionStrings>
  <userSettings>
    <Test.Server.Host.Properties.Settings>
      <setting name="Setting" serializeAs="String">
        <value>테스트1</value>
      </setting>
       </Test.Server.Host.Properties.Settings>
  </userSettings>
</configuration>

 

cs 소스

string DBconn = ConfigurationManager.ConnectionStringsTest.Server.Host.Properties.Settings"].ConnectionString;


string Settions1 = MarinerERP.Server.Host.Properties.Settings.Default["Setting"].ToString();

+ Recent posts