VisualStudio/C# 40

[C#] Action.Invoke() vs Action() 차이

action.Invoke는 action?.Invoke와 같이 action 콜백이 null인지 검사하고 null이 아닐 때에만 Invoke 되도록 사용하고자 할 때 많이 사용한다. 기존 예외처리 if(_action !=null) _action.Invoke(3);// _action(3) 과 같은 코드 ? 키워드를 사용 한 예외처리 _action?.Invoke(3); //if(_action !=null)를 ?키워드를 사용하여 null임을 체크할 수 있다. action(); 는 action.Invoke()와 컴파일과정이 100프로 동일 하다. action이 null이면 NullReferenceException을 뱉기 때문에 위험하다 그래서 invoke를 사용하기 전에 null 검사를 해야 하며 기존 예외처리 처..

VisualStudio/C# 2023.01.05

[C#] nameof()와 default(T)

nameof 변수, 형식 또는 멤버의 이름을 문자열 상수로 생성합니다. string NameOfTest { get; set; } static void Main(string[] args) { string nameofTest = ""; Console.WriteLine(nameof(nameofTest)); Console.WriteLine(nameof(NameOfTest)); } default(T) 기본값 식은 형식의 기본값을 생성합니다. 기본값 식에는 두 가지가 있습니다. 기본 연산자 호출 및 기본 리터럴. Value 일 때는 0을 Ref일 때는 null을 반환한다. public T Test(bool check) { if(check == false) return default(T); return T; }

VisualStudio/C# 2023.01.05

[C#] ? ?? 연산자

이전 포스팅에서는 숫자형과 불리언 타입의 변수에 null을 대입할 수 있는 Nullable 타입을 소개했습니다. 이번 포스팅에서는 null과 관련된 연산자들을 정리합니다. 목차 ?? 연산자 ??= 연산자 ?. 연산자 ?[] 연산자 ?? 연산자 피연산자가 null이 아닌 경우 왼쪽 피연산자의 값을 반환합니다. 피연산자가 null일 경우에는 오른쪽 피연산자의 값을 반환합니다. a ?? b; a가 null이면, b가 반환됩니다. a가 null이 아니면 a가 반환됩니다. ?? 연산자 사용 방법 int? a = null; // a가 null이므로 오른쪽 피연산자(29)가 반환됩니다. int b = a ?? 29; Console.WriteLine(b); 실행 결과 ??= 연산자 왼쪽 피연산자가 null일 경우 오른..

VisualStudio/C# 2023.01.03

[C#] 구조체 메모리 절감

들어가며 C++에 익숙한 사용자라면 class와 struct의 차이라고 해봐야 멤버에 대한 기본 접근한정이 private이냐 public이냐 정도차이 라고 알고 있을 것이다. 하지만 C#에서는 class와 struct의 차이가 매우 크다. 이 포스트에서는 C#에서 struct와 class에 대한 차이를 설명하고 struct를 이용해 많은 메모리를 절약한 시나리오에 대해 알아 보도록 하겠다. 메모리의 타입(유형) 코드에서 객체를 생성할 때 마다 객체는 어느 정도의 메모리를 필요하게 된다. 객체에 대한 메모리는 사용 중이 아닌 영역에 할 당되어야 하며, 이 할당 되어야 하는 메모리는 크게 '스택'과 '힙'이라는 두 가지 종류가 있다. 본론에 들어가기 앞서 이 두가지 유형의 메모리에 대해 간단히 살펴 보도록 ..

VisualStudio/C# 2023.01.03

[C#][개념] 제네릭 클래스

제네릭 클래스(Generic Class)란? 제네릭 클래스(Generic Class)는 클래스 내부의 멤버 변수의 데이터 타입을 일반화한 클래스입니다. 특정 타입에 국한되지 않고 모든 타입을 멤버 변수의 타입으로 설정할 수 있습니다. 제네릭 클래스를 사용하지 않고 멤버 변수의 타입을 object 타입으로 정의할 수 있지만, 안전한 방법이 아니며, 향후 문제가 발생할 가능성이 높기 때문에 좋은 방법은 아닙니다. 이번 포스팅에서는 일반 클래스로 멤버 변수의 타입이 여러개인 경우와 제네릭 클래스(Generic Class)에 대해 정리하였습니다. 목차 일반 클래스의 문제점 제네릭 클래스(Generic Class) 정리 일반 클래스의 문제점 public class IntClass { public int intMe..

VisualStudio/C# 2022.12.02

[C#] Web 종류 net6.0기준

builder.Services.AddRazorPages(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); MVC Model, view, Contoller 방식 고전적이지만 명확함 builder.Services.AddControllersWithViews(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); Razor MVVM 방식 Controller와 View가 합처져 있다. builder.Services.AddRazorPages(); app.MapRazorPages(); WebAPI View가 없는 방식 범용적으로 사용 할 수 있다. bu..

VisualStudio/C# 2022.11.07

[C#서버][방법] 배치(bat)파일 사용 방법 Main(string[] args) args 인자 값 만들기

bat파일 만드는 방법 새로 만들기 -> 메모장 생성 -> 확장자명 .bat로 변경 1. START명령어를 사용하여 exe 실행 자동화 2. exe뒤에 ../../.......은 Main(string[] args) args의 인자값을 생성하는 부분 3. XCOPY /Y GenPackets.cs "../../DummyClient/Packet" XCOPY - 파일을 복사하여 다른 폴더에 저장하기 위해사용 /Y - 이미 파일이 존재한다면 덮어쓰기 protoc.exe -I=./ --csharp_out=./ ./Protocol.proto IF ERRORLEVEL 1 PAUSE START ../../../Server/PacketGenerator/bin/PacketGenerator.exe ./Protocol.prot..

VisualStudio/C# 2022.11.01