Информация об изменениях

Сообщение Re[57]: MS забило на дотнет. Питону - да, сишарпу - нет? от 08.09.2021 19:54

Изменено 08.09.2021 23:23 vdimas

Re[57]: MS забило на дотнет. Питону - да, сишарпу - нет?
Здравствуйте, Serginio1, Вы писали:

V>>Движется к более безопасному и более удобному такому общению.

V>>Де-факто ни одной новой задачи нововведения языка в этой области решать не позволяют, они позволяют более удобно решать старые задачи.
S>А какие новые задачи?

Например, позволить unamanaged-указателям быть аргументами генериков.
Сейчас для того же самого приходится вводить некий прокси-тип:
readonly struct Pointer<T> where T : unmanaged {
    public T * Value;
    public Pointer(T * ptr) => Value = ptr;
}

[StructLayout(LayoutKind.Explicit)]
struct SomeUnion<T1, T2, T3> 
  where T1: unmanaged 
  where T2: unmanaged 
  where T3: unmanaged 
{
    Type _desc;
   
    [FieldOffset(0)] T1 u1;
    [FieldOffset(0)] T2 u2;
    [FieldOffset(0)] T3 u3;

    internal static ref GetRef<T> (ref @this) {
        if(typeof(T) != _desc) throw new InvalidOperationException("Blah-blah-blah");

        return Unsafe.As<T1, T>(ref @this.u1);
    }

    public void Extract<T>(ref T extractor) where T : IUnionExtractor<T1, T2, T3> {
        
    }

    ...
}

public static class SomeUnionExt {
    public T Get<T, T1, T2, T3> (ref this SomeUnion<T1, T2, T3> @this) where ... => SomeUnion<T1, T2, T3>.GetRef<T>(@this);

    public ref T GetRef<T, T1, T2, T3> (ref this SomeUnion<T1, T2, T3> @this) where ... => ref SomeUnion<T1, T2, T3>.GetRef<T>(@this);
...

SomeUnion<Pointer<byte*>, int, IntPtr> u = ...;


Еще момент — статическая линковка нейтивного кода.
Каким-то образом (по крайней мере в .Net Framework так было) они собирают свои либы так, что некоторая функциональность только объявляется на стороне дотнета, но реализуется унутре.
Re[57]: MS забило на дотнет. Питону - да, сишарпу - нет?
Здравствуйте, Serginio1, Вы писали:

V>>Движется к более безопасному и более удобному такому общению.

V>>Де-факто ни одной новой задачи нововведения языка в этой области решать не позволяют, они позволяют более удобно решать старые задачи.
S>А какие новые задачи?

Например, позволить unamanaged-указателям быть аргументами генериков.
Сейчас для того же самого приходится вводить некий прокси-тип:
readonly struct Pointer<T> where T : unmanaged {
    public T * Value;
    public Pointer(T * ptr) => Value = ptr;
}

[StructLayout(LayoutKind.Explicit)]
struct SomeUnion<T1, T2, T3> 
  where T1: unmanaged 
  where T2: unmanaged 
  where T3: unmanaged 
{
    Type _desc;
   
    [FieldOffset(0)] T1 u1;
    [FieldOffset(0)] T2 u2;
    [FieldOffset(0)] T3 u3;

    internal static ref GetRef<T> (ref @this) {
        if(typeof(T) != _desc) throw new InvalidOperationException("Blah-blah-blah");

        return Unsafe.As<T1, T>(ref @this.u1);
    }

    public void Extract<T>(ref T extractor) where T : IUnionExtractor<T1, T2, T3> {
        
    }

    ...
}

public static class SomeUnionExt {
    public T Get<T, T1, T2, T3> (ref this SomeUnion<T1, T2, T3> @this) where ... => SomeUnion<T1, T2, T3>.GetRef<T>(@this);

    public ref T GetRef<T, T1, T2, T3> (ref this SomeUnion<T1, T2, T3> @this) where ... => ref SomeUnion<T1, T2, T3>.GetRef<T>(@this);
...

SomeUnion<Pointer<byte>, int, IntPtr> u = ...;


Еще момент — статическая линковка нейтивного кода.
Каким-то образом (по крайней мере в .Net Framework так было) они собирают свои либы так, что некоторая функциональность только объявляется на стороне дотнета, но реализуется унутре.