Open ufcpp opened 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++;
}
}
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 からしか使わない。
}
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?> と書ければいいんだけど、現状無理
class A
{
public int field;
public int Property
{
// C# 13 で警告、
// C# 14 で breaking change になるかも。
get => field;
set => field = value;
}
}
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 _) { }
}
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;
//System.Threading.Lock が .NET 9 で入る。
// 新 Lock に移行したい。
var lockObj = new Lock();
try
{
lockObj.Enter();
}
finally
{
lockObj.Exit();
}
// が、既存文法の lock(lockObj) が有効…
lock (lockObj)
{
// これが Monitor.TryEnter を呼ばれる実装になってたら、みんな間違う。
// 上記の lockObj.Enter(); 呼ばれる実装にする予定。
}
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)
// にしてるものがそこそこある。
// (多いというだけで、言語ごとにかなりばらつきあり。要注意)
// 古い型はがばがば。
// ネーミングルール外れてる。
// あかん。
_ = 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?
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);
配信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 のところだけ話せたらいいかなぁというところ。