我使用Visual Studio Code在Typescript中编码.有没有办法自动生成通过接口在类中继承的方法存根?
我试图了解C#视图在嵌套方面的类型.
更具体地说,我试图理解为什么某些类型不被认为是赋值兼容甚至可转换的,当"种类"只存在嵌套类的一个定义时.编译器/ CLR是否实际上为这些生成了不同的类型,或者正在发挥什么规则......
示例代码:
public class Foo<T>
{
protected class Private2 : Private1<Foo<T>>
{ }
protected class Private1<T2> where T2 : Foo<T>
{
public sealed class Nested
{
public void Test(T2 foo)
{
foo.Method2(this); //Nope!
var nes = (Private2.Nested)this; //Nope!
}
}
}
public void Method1()
{
var nested = new Private2.Nested();
nested.Test(this);
}
private void Method2(Private2.Nested nested)
{
// something code...
}
}
Run Code Online (Sandbox Code Playgroud)
因此,即使嵌套实例创建为Private2.Nested,也无法将其转换为该类型.而且......好吧......鉴于Nested实际上是密封的,不同的嵌套类型如何相互关联?(他们不能互相继承吗?但另一方面他们的实施应该100%相同......我错了吗?)
主要问题:编译器在"编译"这个嵌套类时究竟做了什么?实际生成了多少个唯一类型(不包括与valuetype相关的类型),如果它是所有"相同"类型,那么限制是否是人为的(因为不安全的转换实际上不起作用)?(我所说的是所有这些类型的IL来自相同的代码定义 - 所以在某种程度上编译器必须知道.这些类型的实例是否与它们的类型名称一点一点地相同?)
次要问题:不是我在这里真正要求的,主要是为了简洁/背景:是否有一些简单的改变可以使上述工作?我错过了一些明显的东西吗
Foo<T>绝不能在内部直接引用类型Private1<T2>- 只T2允许使用.Foo<T>只是我的例子代表了10~20种泛型类型的讨厌泛型类.这只是一个"解决方法",因为它无法为其类型的泛型类别名: …
是否可以从与您编写摘要的方法不同的方法引用参数,如果是,则语法是什么.
我知道<paramref name="..."/>但我不知道如何从不同的方法中引用.
简单幽默的例子,以防我不清楚:
/// <summary>
/// Does magical Foo things!
/// </summary>
/// <param name="magic">Magic Toggle!</param>
public void Foo(bool magic)
{
//...
}
/// <summary>
/// Does Bar things. More down to earth, no <paramref name="Foo(bool).magic"/> involved!
/// </summary>
public void Bar()
{
//...
}
Run Code Online (Sandbox Code Playgroud)
(显然以上不是一个很好的用例,它只是出于插图目的.)
我真正想知道的是哪种反射方法会触发类型初始化?这对我来说有点不清楚.具体来说,如果应用于静态字段,两个提到的方法GetField和GetValue会触发类型初始化吗?我已经尝试过调查此事,据我所知,执行诸如引用或访问静态字段之类的操作将触发所有静态字段的类型初始化.下面我引用了我认为相关的规范部分,但是使用诸如"引用"和"访问"之类的措辞正是我犹豫不决的地方:
什么行为实际上被称为"访问"?
获取字段的FieldInfo元数据是否计为"引用"或"访问"字段?
请帮我找到规格的相关部分,以便我知道我的代码*是安全的和规范.因为一些未记录的实现细节或因为行星碰巧恰好对齐而不是简单地"碰巧工作".
*我的代码通过了测试,但依赖于类型初始化行为.我的代码没有在这里显示,因为它是冗长的,问题不是关于我只是想要"你的代码看起来没问题"回复,而是我想知道如何以及为什么这样我可以评估我的代码是否是规范.是否符合我自己的要求,并且(假设它符合要求)理由我可以做出什么改变而不能做到这一点,而不必每次都提出新的问题.
到目前为止,我知道以下几个规范,它们使用上述术语"引用"和"访问":
我知道ECMA-334 (C#语言规范),静态字段初始化,第17.4.5.1节
如果类中存在静态构造函数(第17.11节),则在执行该静态构造函数之前立即执行静态字段初始值设定项.否则,静态字段初始化器在第一次使用该类的静态字段之前的实现相关时间执行.
还要了解ECMA-334 (C#语言规范),静态构造函数,第17.11节
非泛型类的静态构造函数在给定的应用程序域中最多执行一次.对于从类声明(第25.1.5节)构造的每个闭合构造类型,泛型类声明的静态构造函数最多执行一次.静态构造函数的执行由应用程序域中发生的以下第一个事件触发:
- 创建了一个类的实例.
- 引用该类的任何静态成员.
如果一个类包含执行开始的Main方法(第10.1节),则该类的静态构造函数在调用Main方法之前执行.如果一个类包含带有初始化程序的任何静态字段,那么这些初始化程序将在执行静态构造函数之前立即以文本顺序执行(第17.4.5节).
更相关的是ECMA-335 (CLI规范),类型定义,第一部分,第8.9.5节
[...]触发执行此类型初始化方法的时间和内容的语义如下:
- 类型可以具有类型初始化方法或不具有类型初始化方法.
- 可以将类型指定为其类型初始化方法具有宽松的语义(为方便起见,我们称之为松弛语义BeforeFieldInit).
- 如果标记为BeforeFieldInit,则类型的初始化方法在首次访问为该类型定义的任何静态字段时或之前执行.
- 如果未标记为BeforeFieldInit,则执行该类型的初始化方法(即,由以下方式触发):
a.首先访问该类型的任何静态字段,或
b.首先调用该类型的任何静态方法,或
c.如果是值类型或
d ,则首先调用该类型的任何实例或虚方法 .首次调用该类型的任何构造函数.- 执行任何类型的初始化方法都不会触发自动执行由其基类型定义的任何初始化方法,也不会触发该类型实现的任何接口.
相关的MSDN链接:
Type.GetField方法
FieldInfo类
FieldInfo.GetValue方法
我对基类析构函数中的 this 指针有一个奇怪的问题。
问题描述:
我有 3 个班级:A1,A2,A3
A2从A1公开继承,从A3私下继承
class A2:private A3, public A1 {...}
Run Code Online (Sandbox Code Playgroud)
A3有一个函数getPrimaryInstance() ...返回A1类型对A2实例的引用:
A1& A3::getPrimaryInstance()const{
static A2 primary;
return primary;
}
Run Code Online (Sandbox Code Playgroud)
而A3的构造是这样的:
A3(){
getPrimaryInstance().regInst(this);
}
Run Code Online (Sandbox Code Playgroud)
(其中regInst(...)是A1中定义的函数,用于存储指向所有A3实例的指针)
类似的A3析构函数:
~A3(){
getPrimaryInstance().unregInst(this);
}
Run Code Online (Sandbox Code Playgroud)
^这就是问题发生的地方!
当名为primary的静态A2实例在程序终止时被销毁时,将调用A3析构函数,但在~A3 中,我尝试访问我正在销毁的同一实例上的函数。 =>运行时访问冲突!
所以我认为可以用一个简单的 if 语句来修复,如下所示:
~A3(){
if(this != (A3*)(A2*)&getPrimaryInstance()) //Original …Run Code Online (Sandbox Code Playgroud) 说(可能在一个单独的线程上)我正在运行一些方法ClassA.foobar().在这个方法里面是一个尝试,(可能是捕获),最后阻止.
现在,如果执行仍在try-block(或catch-block)中间时,对此ClassA对象(或此线程)的最后一次引用会丢失,那么此对象(/ thread)是否可以在我获取之前进行垃圾回收到了最后一块?换句话说:即使没有对内存中剩余的对象(/ thread)的强引用,finally块仍然可以保证运行吗?
(我不知道GC如何处理孤立的活线程.)
虚拟的例子:
[Some context]
{
ClassA classA = new ClassA();
//Point is this instance and a reference to it exists
class ClassA
{
public void foobar()
{
try
{
classA = null;
//Point is that the last reference to this instance is lost,
//and that this happens at this point in foobar() execution.
//The actual location of this line of code is irrelevant.
}
finally
{
//some important stuff here!
}
}
}
}
Run Code Online (Sandbox Code Playgroud) java garbage-collection finally thread-safety try-catch-finally
问题是:我想要一个泛型函数,它具有泛型类型的out参数.将泛型类型限制为ref-type,并且没有问题.但我想要一个完全不受限制的通用类型!没有new()或类/ struct限制!
public class A
{ }
public class B<T> : A
{
public T t;
public B(T i)
{
this.t = t;
}
}
public static class S
{
public static bool Test<T>(ref A a, out T t)
{
C<T> c = a as C<T>;
if(c != null)
{
t = c.t;
return true;
}
else
return false;
}
}
class Run
{
static void Main(string[] args)
{
C<SomeType> c = new C<SomeType>(new SomeType(...));
SomeType thing;
S.Test<SomeType>(c,thing);
}
} …Run Code Online (Sandbox Code Playgroud) c# ×4
c++ ×1
destructor ×1
finally ×1
generics ×1
java ×1
nested ×1
out ×1
reflection ×1
restrictions ×1
sandcastle ×1
this-pointer ×1
types ×1
typescript ×1