ufcpp-live / UfcppLiveAgenda

@ufcpp live streaming agenda
MIT License
24 stars 2 forks source link

C# vNext トリアージ #82

Open ufcpp opened 11 months ago

ufcpp commented 11 months ago

配信URL: https://www.youtube.com/watch?v=U_7pL7TqY6I

https://github.com/ufcpp-live/UfcppLiveAgenda/issues/80 にちょこっとだけメモしてたけども触れるの忘れてた。 C# 13 向けのトリアージ作業始まってる。 (そのあともう1個、LDM Notes 出ててそっちでもトリアージ作業してた。)

https://ufcpp.net/blog/2023/10/triage2023/

時間の余り方によっては https://github.com/ufcpp-live/UfcppLiveAgenda/issues/81 の続きやる。 あともう、Collections のところだけ話せたらいいかなぁというところ。

ufcpp-live commented 11 months ago
// 終わる
Console.WriteLine(infiniteSequence() is [var first, .., var last]);

// ただし、別に今更。
// ↓これでも終わってる。
foreach (var x in infiniteSequence())
{
    // break するなら大丈夫なんだけども…
}

// これも終わってるし。
var last = infiniteSequence().Last();

static IEnumerable<int> infiniteSequence()
{
    int i = 0;
    while (true)
    {
        yield return i++;
    }
}
ufcpp-live commented 11 months ago
namespace ConsoleApp1;

// namespace private なクラス作りたいなぁ。
// (Working set 入り。)
// (たぶん、アセンブリまたぐとダメなはず。
//  初心者にやさしくない?)
private class A0 { }

// A 本体
public partial class A
{
}

public partial class A
{
    // A.cs がでかくなりすぎるし、インデントきつい。
    // かといって、A に partial 付けるのだるい。
    private class A1
    {
        // A からしか使わないのに…
    }
}

// internal は範囲広すぎる
internal class A1
{
    // A からしか使わないのに…
}

// 名前通り、ファイル分けれない
file class A2
{
    // A からしか使わない。
}
ufcpp-live commented 11 months ago
using System.Diagnostics.CodeAnalysis;

var s = M();

Console.WriteLine(s.Length);

var s1 = await MAsync();
Console.WriteLine(s1.Length);

[return:NotNull]
string? M() => "";

[return: NotNull]
async Task<string?> MAsync() => "";
//async Task<[NotNull]string?> と書ければいいんだけど、現状無理
ufcpp-live commented 11 months ago
class A
{
    public int field;
    public int Property
    {
        // C# 13 で警告、
        // C# 14 で breaking change になるかも。
        get => field;
        set => field = value;
    }
}
ufcpp-live commented 11 months ago
Action a = new A().M;
Action<string> b = new A().M; // 通る。オーバーロード解決してる。かつ、インスタンスメソッド優先。
var c = new A().M; // public void M(string _) { } を消してもなぜか通らん。

class A
{
    public void M() { }
    public void M(string _) { }
}

static class AEx
{
    public static void M(this A a, string _) { }
}
ufcpp-live commented 11 months ago
using System.Globalization;
using System.Text.Unicode;

int x = 1;
int y = 2;

// .NET 8 でクソ速くなってしまった。
// UTF-16 → 8 の変換がほぼノーコスト。
Span<byte> buffer = stackalloc byte[100];
Utf8.TryWrite(buffer, CultureInfo.InvariantCulture,
    $"{x}, {y}",
    out var written);

// ↑が早くなった今、 $""u8 要る?
ReadOnlySpan<byte> ut8 = $"{x}, {y}"u8;
ufcpp-live commented 11 months ago
//System.Threading.Lock が .NET 9 で入る。

// 新 Lock に移行したい。
var lockObj = new Lock();

try
{
    lockObj.Enter();

}
finally
{
    lockObj.Exit();
}

// が、既存文法の lock(lockObj) が有効…
lock (lockObj)
{
    // これが Monitor.TryEnter を呼ばれる実装になってたら、みんな間違う。
    // 上記の lockObj.Enter(); 呼ばれる実装にする予定。
}
ufcpp-live commented 11 months ago
var x = -8;

Console.WriteLine(x % 5); // -3。 2になってほしいことの方が実用上は多い。

//int[] array = [1, 2, 3, 4, 5];
//var item = array[x % array.Length]; // これだと out of range。

static T mod<T>(int x, T[] array)
{
    var n = x % array.Length;
    if (n < 0) n += array.Length; // これが要る。
    return array[n];
}

// 他の言語だとどう?
// -3 になる方を rem (remainder)
// 2 になる方を mod (modulo)
// にしてるものがそこそこある。
// (多いというだけで、言語ごとにかなりばらつきあり。要注意)
ufcpp-live commented 11 months ago
// 古い型はがばがば。
// ネーミングルール外れてる。
// あかん。
_ = System.Text.Encoding.UTF8;
Math.IEEERemainder;

// 新しい型はちゃんと2文字目以降小文字。
System.Numerics.IBinaryFloatingPointIeee754
System.Text.Unicode.Utf8

// .NET ルールのダメなところ。
// 「2文字の略語は2文字とも大文字でいい」
// くそ。
System.IO;
DBNull;

// だったらこいつは…
System.Data.DbType;

// OK
// all correct が元ネタらしい?
// oll korrect とか書くスラング的なものがあった
// これの頭文字略語で OK
// 元単語すら意味不明なのでそのうち略語であることが忘れられて "ok" に。
// なんだったら okay と書かれる。
// okay の略語で ok?
ufcpp-live commented 11 months ago
var x = 17;
var y = 3;

Console.WriteLine((x / y, x % y));
Console.WriteLine((-x / y, -x % y));
Console.WriteLine((x / -y, x % -y));
Console.WriteLine((-x / -y, -x % -y));

// この式が常に成り立つはず。
// mod の定義がこれ。
Console.WriteLine(x % y == x - (x / y) * y);