В JavaScript тип значения исключительно определяет, будет ли это значение присвоено копией значения или копией-копией.
Примитивные значения всегда назначаются / передаются с помощью copy-копии :
null
undefined
ES6
Соединение значения всегда назначаются / передаются с помощью reference-copy
Например
var a = 2;
var b = a; // `b` is always a copy of the value in `a`
b++;
a; // 2
b; // 3
var c = [1,2,3];
var d = c; // `d` is a reference to the shared `[1,2,3]` value
d.push( 4 );
c; // [1,2,3,4]
d; // [1,2,3,4]
В приведенном выше фрагменте, поскольку 2
является скалярным примитивом, a
содержит одну начальную копию этого значения, а b
присваивается другая копия значения , При изменении b
вы никоим образом не изменяете значение в a
.
Но оба c
и d
являются отдельными ссылками на одно и то же общее значение [1,2,3]
, которое является составная величина. Важно отметить, что ни c
, ни d
больше не «владеют» значением [1,2,3]
- оба равны равным равноправным ссылкам на значение. Таким образом, при использовании любой ссылки для изменения (.push(4)
) фактического общего значения array
, это влияет только на одно общее значение, и обе ссылки будут ссылаться на вновь измененное значение [1,2,3,4]
.
var a = [1,2,3];
var b = a;
a; // [1,2,3]
b; // [1,2,3]
// later
b = [4,5,6];
a; // [1,2,3]
b; // [4,5,6]
Когда мы выполняем присваивание b = [4,5,6]
, мы ничего не делаем, чтобы повлиять на a
, где [1,2,3]
все еще ссылается. Для этого b
должен быть указателем на a
, а не ссылкой на array
, но в JS нет такой возможности
function foo(x) {
x.push( 4 );
x; // [1,2,3,4]
// later
x = [4,5,6];
x.push( 7 );
x; // [4,5,6,7]
}
var a = [1,2,3];
foo( a );
a; // [1,2,3,4] not [4,5,6,7]
Когда мы проходим аргумент a
, он присваивает копию ссылки a
на x
. x
и a
- отдельные ссылки, указывающие на то же значение [1,2,3]
. Теперь внутри функции мы можем использовать эту ссылку для мутации самого значения (push(4)
). Но когда мы выполняем присваивание x = [4,5,6]
, это никоим образом не влияет на то, где указывается начальная ссылка a
, - все еще указывает на значение (теперь измененное) [1,2,3,4]
.
Чтобы эффективно пройти составное значение (например, array
) по копированию значения, вам нужно вручную сделать его копию, чтобы переданная ссылка не все еще указывала на оригинал. Например:
foo( a.slice() );
Составное значение (объект, массив и т. Д.), Которое может быть передано посредством reference-copy
function foo(wrapper) {
wrapper.a = 42;
}
var obj = {
a: 2
};
foo( obj );
obj.a; // 42
Здесь obj
действует как обертка для скалярное примитивное свойство a
. Когда передано foo(..)
, копия ссылки obj
передается и устанавливается в параметр wrapper
. Теперь мы можем использовать ссылку wrapper
для доступа к общему объекту и обновить его свойство. После завершения функции obj.a
вы увидите обновленное значение 42
.
Что-то вроде этого я не тестировал его
получить среду
EnvDTE80.DTE2 pEnv = null;
Type myType = Type.GetTypeFromProgID("VisualStudio.DTE.8.0");
pEnv = (EnvDTE80.DTE2)Activator.CreateInstance(myType, true);
получить решение.
Solution2 pSolution = (Solution2)pEnv.VS.Solution;
получить проект, который вы хотите
Project pProject = pSolution.Projects[0];
добавить ссылку
pProject.References.Add(string referenceFilePath);
В CodeProject есть пример.
Функциональность содержится в одном классе elRefManager
, а метод вызова - CheckReferences
. Код можно посмотреть здесь здесь , выбрав файл elRefManager.cs с левой стороны.
Как видно из статьи, вы можете сделать ...
private void button1_Click(object sender, System.EventArgs e)
{
int ec;
ec=elRefManager.CheckReferences(null, new string[] {textBox1.Text});
if (ec<0)
MessageBox.Show("An error occurred adding this reference");
if (ec>0)
MessageBox.Show("Could not add " + textBox1.Text +
"\nCheck its spelling and try again");
}
System.Assembly.load
Позволяет вам вызывать функции в библиотеке, которые не были созданы с вашей программой.
Если вы хотите добавить ссылку на проект, чтобы его в решении вы могли использовать следующее. В основном то же, что и @Scots.
Я сделал это в макросе, которое является vb, но я уверен, что вы можете получить эту идею
DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate()
Dim objProject As EnvDTE.Project
Dim i As Long
i = DTE.Solution.Projects.Count
For Each objProject In DTE.Solution.Projects
If (objProject.Name() = "csCA") Then
Dim vsproj As VSLangProj.VSProject
vsproj = objProject.Object
vsproj.References.Add("C:\Users\test.dll")
End If
Next
Assembly.Load
, а затем Activator.CreateInstance
– jgauffin
10 December 2010 в 16:22
Assembly
для запуска кода.
– Daniel DiPaolo
10 December 2010 в 16:22