当我在Visual Studio 8中向项目添加程序集引用时,该引用的Aliases属性设置为"global".这个属性有什么用?为什么它设置为全局?
MSDN告诉我,这是程序集的别名列表,但不是为什么我可能想要使用此属性或为什么大多数别名为"全局".
我有一个大型数据框(大约几GB),我想转换为data.table.使用as.data.table创建数据框的副本,这意味着我需要的可用内存至少是数据大小的两倍.有没有办法在没有副本的情况下进行转换?
这是一个简单的示例来演示:
library(data.table)
N <- 1e6
K <- 1e2
data <- as.data.frame(rep(data.frame(rnorm(N)), K))
gc(reset=TRUE)
tracemem(data)
data <- as.data.table(data)
gc()
Run Code Online (Sandbox Code Playgroud)
随着输出:
library(data.table)
# data.table 1.8.10 For help type: help("data.table")
N <- 1e6
K <- 1e2
data <- as.data.frame(rep(data.frame(rnorm(N)), K))
gc(reset=TRUE)
# used (Mb) gc trigger (Mb) max used (Mb)
# Ncells 303759 16.3 597831 32.0 303759 16.3
# Vcells 100442572 766.4 402928632 3074.2 100442572 766.4
tracemem(data)
# [1] "<0x363fda0>"
data <- as.data.table(data)
# tracemem[0x363fda0 -> 0x31e4260]: copy …Run Code Online (Sandbox Code Playgroud) 这些都是一样的:
int foo(bar* p) {
return p->someInt();
}
Run Code Online (Sandbox Code Playgroud)
和
int foo(bar& r) {
return r.someInt();
}
Run Code Online (Sandbox Code Playgroud)
忽略空指针潜力.这两个函数在功能上是否相同,无论它们someInt()是虚拟的还是传递给它们bar的子类bar?
这会切片吗:
bar& ref = *ptr_to_bar;
Run Code Online (Sandbox Code Playgroud) 考虑一下:
List<MyClass> obj_list = get_the_list();
foreach( MyClass obj in obj_list )
{
obj.property = 42;
}
Run Code Online (Sandbox Code Playgroud)
'obj'是对列表中相应对象的引用,这样当我更改属性时,更改将在构造到某处的对象实例中持续存在吗?
我有以下情况
项目A.
- Uses Castle Windsor v2.2
- Uses Project B via WindsorContainer
Run Code Online (Sandbox Code Playgroud)
项目B.
- Uses NHibernate
- Uses Castle Windsor v2.1
Run Code Online (Sandbox Code Playgroud)
在Project AI的bin文件夹中有dll Castle.DynamicProxy2.dll v2.2和NHibernate dll.现在问题是NHibernate依赖于Castle.DynamicProxy2.dll v2.1而不存在.我该如何解决这种情况.
Javascript通过引用传递对象.这很有道理.但是一旦你开始操纵这些物体,一切都会以一种看起来不直观的方式发挥作用.让我举一个例子:
var a, b;
a = {}
b = a;
a['one'] = {};
console.log( JSON.stringify(a) );
// outputs: {"one":{}}
console.log( JSON.stringify(b) );
// outputs: {"one":{}}
Run Code Online (Sandbox Code Playgroud)
这一切都很好,因为现在b有一个指针,a所以预计分配东西a也会影响b.
但是如果我这样做:
a = a['one'];
console.log( JSON.stringify(a) );
// outputs: {}
console.log( JSON.stringify(b) );
// outputs: {"one":{}}
Run Code Online (Sandbox Code Playgroud)
这对我来说很惊讶.我期望a,并b仍然是相同的(并且是{}因为a['one']原先设置为{}和a设置为a['one']).
但事实并非如此.似乎a失去了b对它被赋予新内容的时间的引用,但b保留了a在a失去引用之前设置的值b.
但是如果我这样做:
a['two'] …Run Code Online (Sandbox Code Playgroud) 我在其中一个应用程序中看到了以下代码:
public class First()
{
private Second _second;
public First()
{
_second = new Second(this);
// Doing some other initialization stuff,
}
}
public class Second
{
public Second(First f)
{
}
}
Run Code Online (Sandbox Code Playgroud)
在First()构造函数中,我们First() 在完全构造之前发送类的引用并不是很糟糕吗?我认为只有在控制逻辑离开构造函数时,对象才会完全构造.
或者这没关系?
我正在使用VS2010,我试图通过文件引用从本地硬盘添加一些程序集到我的C#项目.窥视csproj文件,我发现有时文件引用显示为
<Reference Include="name">
Run Code Online (Sandbox Code Playgroud)
但有时它看起来像
<Reference Include="name, Version=xxx, Culture=neutral,
processorArchitecture=MSIL">
Run Code Online (Sandbox Code Playgroud)
什么可能导致差异?
受到k3b答案的启发,我做了另一个测试.我创建了一个新的类库项目.
添加文件引用.的初始值特定版本的属性面板是假.该csproj文件看起来像
<Reference Include="Name">
<HintPath>...</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)更改特定版本的属性窗格真.VS在Include属性中添加版本.
<Reference Include="Name, Version=...">
<HintPath>...</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)更改特定版本的属性窗格中假一次.VS添加了一个子元素SpecificVersion.
<Reference Include="Name, Version=...">
<HintPath>...</HintPath>
<SpecificVersion>False</SpecificVersion>
</Reference>
Run Code Online (Sandbox Code Playgroud)所以似乎规则是:
SpecificVersion子元素,该文件组件被配置为特定版本SpecificVersion子元素只与价值附加假.有一点我还是不明白:
reference ×10
c# ×4
c++ ×3
csproj ×2
pointers ×2
assemblies ×1
constructor ×1
data.table ×1
dataframe ×1
foreach ×1
javascript ×1
r ×1