프로그래밍/C#
[C#] 구조체의 get/set을 조심하자
[C#] 구조체의 get/set을 조심하자
2024.06.04잠깐 생각해보면 당연하고 별 거 아닌데, 아무 생각 없이 쓰다가 디버깅때문에 고통받았다. 보통 외부에서 참조는 할 수 있지만 내부에서만 변경하고 싶은 객체를 만들 때, get/set을 쓰는 게 일반적이다. 예시로 단순히 int 변수를 가진 somethingClass 객체를 만든다고 해 보자.public static somethingClass A { get; private set; } public static void Main(string[] args) { A = new somethingClass(0); A.count++; Console.WriteLine(A.count); //Output is 1 } public class somethingClass { public int count; public some..
왜 partial Enum은 없는 걸까?
왜 partial Enum은 없는 걸까?
2024.03.21왜 partial Enum을 쓰려고 했는가 최근 개인 프로젝트에서 partial class를 자주 활용하는 방식으로 개발하고 있다. 파일 하나에 클래스의 모든 멤버나 메서드를 정의하지 않고, 다른 파일에 나눠서 적을 수 있어서 확장성이 높은 방법이라고 생각한다. 이런 방식을 자주 쓰다 보니 아래와 같은 경우가 생겼다. public static partial class ModifierUtil { public const int StatMaxPenaltyId = 3; public static void AddStatPenalty(this ModifierStorage storage, int value) { storage.Add(new ModifierSomething(StatMaxPenaltyId, value));..
ZString 라이브러리는 어떻게 제로 할당을 주장하는가
ZString 라이브러리는 어떻게 제로 할당을 주장하는가
2023.08.04string을 매번 선언할 때마다 메모리 할당이 일어나는 것은 당연한 일이지만, 그만큼 경계해야 할 일이기도 하다. 특히나 프레임마다 string을 선언하거나 stringBuilder 없이 문자열을 합치는 것은 성능 상 좋지 않다. 이러한 메모리 할당을 줄이는 방법은 굉장히 다양하지만, 이번 글에서는 가장 금방 적용할 수 있는 라이브러리를 소개한다. https://github.com/Cysharp/ZString GitHub - Cysharp/ZString: Zero Allocation StringBuilder for .NET and Unity. Zero Allocation StringBuilder for .NET and Unity. Contribute to Cysharp/ZString developmen..
C# 9.0 새 기능 알아보기
C# 9.0 새 기능 알아보기
2023.01.16최근 유니티 2021 버전을 주로 사용하게 됨에 따라, C# 9.0의 기능을 정리할 필요성을 느껴 오랜만에 포스팅을 한다. 2022 버전에서도 C# 9.0을 사용하고 있으니 당분간 C# 신기능 포스팅은 이후로는 없을 듯 하다. 마이크로소프트 공식 문서를 참조했다. 레코드 레코드(record) 형식이 새로 추가되었다. 변경할 수 없는 데이터 모델을 지원하기 위해 만들어졌다. 레코드는 초기화 한 뒤에는 객체 내의 멤버들을 변경할 수 없다. public record Person(string FirstName, string LastName); public record Person { public string FirstName { get; init; } = default!; public string LastNam..
C# 8.0 새 기능 알아보기
C# 8.0 새 기능 알아보기
2022.09.20최근 코드를 작성하던 중 C# 11에 다양한 기능이 추가되었다는 걸 알게 되어 이것저것 해 보았다. 어트리뷰트를 상속받는 제네릭 클래스를 선언 문자열 보간에서 줄 바꿈을 할 수 있다 이스케이프 문자를 사용하지 않고 문자열을 선언할 수 있다 구조체의 모든 필드가 기본값으로 초기화됨 다만 이 멋진 기능들을 당장 사용하는 건 불가능했는데, C# 11은 프리뷰 버전이며 Unity에서도 적용하고 있지 않기 때문이다. 그럼 Unity에서는 대체 C#의 어떤 버전을 사용하고 있단 말인가? 답은 공식 문서에서 찾을 수 있었다. 유니티 버전이 올라갈 때마다 C# 버전도 함께 상승하고 있으며, 현재 최신으로는 C# 9.0을 적용하고 있음을 알 수 있다. 유니티 버전(LTS 기준) 컴파일러 C# 언어 버전 2020.3 Ro..
C# 구조체 : 기본 매개변수를 사용한 생성자는 호출되지 않을 수도 있다
C# 구조체 : 기본 매개변수를 사용한 생성자는 호출되지 않을 수도 있다
2022.07.10문제 상황 나는 여느 때처럼 클래스 객체를 사용해 다른 함수에게 데이터를 넘겨주고 있었다. public class Tester : MonoBehaviour { private void Start() { var data = new Data(); Initialize(data); } public void Initialize(Data data) { //Something } } public class Data { public int crushId = -1; public int count = 0; public Data(int crushId = -1, int count = 0) { this.crushId = crushId; this.count = count; } } 그런데, 클래스 객체가 이곳저곳에 호출되면서 중간에 ..
Enum.ToString 최적화하기
Enum.ToString 최적화하기
2022.02.25프로파일러를 뚫어지게 쳐다보다가 이상한 것을 발견했다. 별 생각 없이 사용하고 있던 enum값의 ToString()이 파멸을 초래하고 있었다. 한번 Call을 할 때마다 0.003ms를 먹어치우고 있던 상황. 코드에서는 1프레임에 80번을 호출하고 있었으니 자그마치 0.24ms를 차지하고 있던 셈이다. 찾아보니 원래 enum.ToString()은 값이 비싼 메서드라고 한다. 왜냐면 리플렉션을 사용하니까! 조금만 생각해봐도 값이 비싼건 당연한 것이다. 이를 해결하기 위해서 다양한 방법들을 찾아보았다. 1. 자체 Dictionary에 캐싱 //데이터는 입력되었다고 가정 private readonly Dictionary e_s_cache = new Dictionary(); public string ToStri..
[.Net C# 설명서] 읽고 정리하기
[.Net C# 설명서] 읽고 정리하기
2021.09.29본 글은 공부하며 작성하였습니다. 정보를 얻으실 때 사실과 다르거나 부정확한 정보가 들어있을 수도 있습니다. 내용 출처https://docs.microsoft.com/ko-kr/dotnet/csharp/tour-of-csharp/ C# 둘러보기 - C# 가이드C#을 처음 사용하시나요? 언어의 기본 사항에 대해 알아봅니다. 이 개요에서 시작합니다.docs.microsoft.com 최근에 기초를 더 탄탄하게 다져야 한다고 느껴서, C# 라이브러리를 읽고 정리해보기로 했다. 이전 글과 마찬가지로, 전체 내용보다는 새롭게 배웠거나 필요성을 느낀 내용들을 정리해보려 한다.부호 있는 정수와 부호 없는 정수부호 있는 정수 : sbyte, short, int, long 부호 없는 정수 : byte, ushort, ui..
[C# 코딩의 기술]에서 얻은 지식들
[C# 코딩의 기술]에서 얻은 지식들
2021.09.24본 글은 공부하며 작성하였습니다. 정보를 얻으실 때 사실과 다르거나 부정확한 정보가 들어있을 수도 있습니다. https://ridibooks.com/books/754016655 C# 코딩의 기술 (기본편) : 똑똑하게 코딩하는 법 초보자가 놓치기 쉬운 실수나 이슈, 패턴을 소개하고 그 해결법을 에피소드 형식으로 제시해주는 C# 활용서 C# 제대로 알고 쓰자!C#은 C/C++, 자바와 문법이 비슷하지만, 구조적으로나 태생적으로 ridibooks.com 오늘 'C# 코딩의 기술' 서적을 드디어 다 읽었다. 대화 형식으로 C#의 꿀팁들을 설명해주는 게 좋은 책이었는데, 후반부로 갈 수록 어쩐지 내용에 힘이 빠지는 게 느껴져서 아쉽긴 했다. 어쨌든, 새롭게 얻은 지식들을 정리해보겠다. IEnumerable 인터..
C# 연산자 오버로딩 : ==, Equals에서 null값 판단하기
C# 연산자 오버로딩 : ==, Equals에서 null값 판단하기
2021.03.24문제 상황 == 연산자를 오버로딩하고 사용하려 했는데, 문제가 발생했다. a == b 와 같은 구문에서 a나 b가 null인 경우를 판단할 수 없었기 때문이었다. public static bool operator ==(Stat a, Stat b) { if (a == null && b == null) return true; } 이와 같이 작성하게 되면, 스택 오버플로우가 발생한다. 이유는 당연하다. a == null인 구문도 연산자 오버로딩한 '==' 연산자를 사용하기 때문. 해결법 object.ReferenceEquals(object, object)을 사용하면 된다. Equals나 ==과는 달리, object.ReferenceEquals는 재정의할 수 없는 메서드이다. 이 메서드는 지정한 object의 ..
LINQ Method 정리
LINQ Method 정리
2020.05.06본 글은 공부하며 작성하였습니다. 정보를 얻으실 때 사실과 다르거나 부정확한 정보가 들어있을 수도 있습니다. LINQ의 Method를 정리한다. 예제는 마이크로소프트 문서 또는 본인 코드. Aggregate 데이터를 누적하여 집계한다. 원하는 규칙을 정해 데이터를 가공한다고 생각하면 된다. string[] fruits = { "apple", "mango", "orange", "passionfruit", "grape" }; // Determine whether any string in the array is longer than "banana". string longestName = fruits.Aggregate("banana", (longest, next) => next.Length > longest.L..
C# Closure : for문의 변수를 람다식에서 참조하면 슬퍼지는 이유
C# Closure : for문의 변수를 람다식에서 참조하면 슬퍼지는 이유
2019.07.291 발생한 문제 오늘 개인 프로젝트를 작업하다가 슬픈 일을 겪었다. delegate를 사용해 Change_Tab 함수를 버튼에 추가하려고 했는데, 의도대로 되지 않았다. 아래쪽과 같은 코드를 사용해 프로그램을 구현했더니 다음과 같은 결과가 발생했다. 의도한 대로라면 아래쪽과 같이 탭을 누를 때마다 해당 탭으로 이동해야 했지만, 위와 같이 아무리 눌러도 첫번째 탭을 보여 주고 있었던 것이다. 심지어 for문에는 아무런 문제가 없었다. i를 Print로 출력해 봐도 0, 1, 2, 3, 4를 반복할 뿐이었고, 고통받았다. 원인은 Closure에 대한 잘못된 이해였다. 그러므로 미래에 내가 고통받지 않기 위해 클로저에 대해 정리하고, 왜 위의 코드가 슬픈 결과를 낼 수밖에 없었는지 알아 보겠다. 2 클로저 클..