νŒŒκ΄΄μ™• event

(.net 7.0, nullable: enable)

class Foo
{
    public event EventHandler? FooEvent;
}

class Bar
{
    public Bar(Foo foo)
    {
        foo.FooEvent -= FooEventHandler;
        foo.FooEvent += FooEventHandler;
    }

    private void FooEventHandler(object? s, EventArgs e) { }
}

1. 이벀트λ₯Ό ꡬ독 및 ꡬ독 μ·¨μ†Œλ₯Ό ν•  λ•ŒλŠ” null에 λŒ€ν•΄ κ΄€λŒ€ν•©λ‹ˆλ‹€.

null 검사 μ•ˆ 해도 κ²½κ³ λ‚˜ 뭐 이런 κ±° μ•ˆ λœΉλ‹ˆλ‹€. 뭐 μ΄κ±°λŠ” λ‹€λ“€ μ•„μ‹€ κ²ƒμž…λ‹ˆλ‹€.

2. 기쑴에 λ“±λ‘λ˜μ§€ μ•Šμ€ 이벀트 ν•Έλ“€λŸ¬λ₯Ό ꡬ독 μ·¨μ†Œλ₯Ό 해도 μ—λŸ¬κ°€ μ—†μŠ΅λ‹ˆλ‹€

즉, β€œ-=” μ—°μ‚°μžλ₯Ό μ“°κΈ° 전에 β€œ+=” μ—°μ‚°μžκ°€ μžˆμ—ˆλŠ”μ§€ μ—†μ—ˆλŠ”μ§€ 확인할 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
λ§Žμ€ κΈ€μ—μ„œ, IDisposable 을 κ΅¬ν˜„ν•΄μ„œ, 객체가 μ†Œλ©Έλ˜κΈ° 전에 κ΅¬λ…ν•œ 이벀트λ₯Ό ꡬ독 μ·¨μ†Œν•˜λΌκ³  κΆŒκ³ ν•˜κ³  μžˆλŠ”λ°,

class Bar : IDisposable
{
    private Foo _foo;
    public Bar(Foo foo)  {  _foo = foo;   _foo.FooEvent += FooEventHandler;   }

    private void FooEventHandler(object? s, EventArgs e) { }

    public void Dispose() { _foo.FooEvent -= FooEventHandler; }
}

λ‹¨μˆœνžˆ 2쀑 ꡬ독 ν˜Ήμ€ ꡬ독 λˆ„μ μ΄ λ¬Έμ œλ˜λŠ” 경우, μœ„μ™€ 같은 번작슀런 νŒŒμƒ μ½”λ“œλ₯Ό μ“Έκ²Œ μ•„λ‹ˆλΌ,
λ¬΄μ§€μ„±μœΌλ‘œ -= μ—°μ‚°μž λ¨Όμ € ν˜ΈμΆœν•˜κ³ , += μ—°μ‚°μž ν˜ΈμΆœν•˜λ©΄ 맀우 κ°„λ‹¨ν•΄μ§‘λ‹ˆλ‹€.

또 ν•˜λ‚˜, μž¬λ―ΈμžˆλŠ” 사싀은

3. μ΄λŸ¬ν•œ κ΄€λŒ€ν•œ μ‚¬μš©λ²•μ—λ„ λΆˆκ΅¬ν•˜κ³ , 이벀트 호좜의 경우, null κ²½κ³ λŠ” μ—„κ²©ν•©λ‹ˆλ‹€.

class Foo
{
    public event EventHandler? FooEvent;
    
                          // null κ²½κ³ .
    public void Fire() {  FooEvent.Invoke(this, EventArgs.Empty);  } 
}

이런 선택적 μ—„κ²©ν•¨μœΌλ‘œ 인해 마치 λ­”κ°€ 혼자만 λ²•μœ„μ— κ΅°λ¦Όν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

8개의 μ’‹μ•„μš”

잘 μ•„μ‹œκ² μ§€λ§Œ nullable 개체의 경우 ?둜 κ²½κ³ λ₯Ό ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

class Foo
{
    public event EventHandler? FooEvent;

    public void Fire() { FooEvent?.Invoke(this, EventArgs.Empty); }
}
6개의 μ’‹μ•„μš”

μΈμ§€ν•˜μ§€ λͺ»ν–ˆλ˜ 뢀뢄인데, λ§μ”€ν•˜μ‹  뢀뢄이 이해가 λ©λ‹ˆλ‹€.

이벀트λ₯Ό λΊ„λ•ŒλŠ” null체크λ₯Ό μ•ˆν•˜λŠ”λ° μ“Έλ•ŒλŠ” ν•˜λ‹€λ‹ˆβ€¦λ¬Έμ œμΈμ‹μ΄ 생기고 λ³΄λ‹ˆ μ‹ κΈ°ν•˜κΈ΄ν•˜λ„€μš”!

3개의 μ’‹μ•„μš”