Проблема в том, что вы каждый раз переназначаете объект options
, поскольку объекты являются ссылочными типами. Даже если бы вы сделали что-то подобное в своей функции: newOptions = options
вы бы все равно ссылались на ваш старый объект options
, и любые изменения в «новом» объекте newOptions
также изменили бы объект options
.
Однако, если вы хотите получить точно такой же объект и изменить его, не затрагивая другой, вы должны клонировать его. Вы можете добиться этого в JavaScript с помощью метода Object.create()
. Вы можете прочитать больше об этом здесь .
Таким образом, весь ваш код будет выглядеть так:
var options = {x: 10}
console.log(options.x + ' original options object');
cat(options);
function cat(options) {
newOptions = Object.create(options);
newOptions.x = 3;
x = newOptions.x;
console.log(x + ' cat = 3'); // this should equal 3
mouse(x);
}
dog(options);
function dog(options) {
newOptions = Object.create(options);
newOptions.x = 7;
x = newOptions.x;
console.log(x + ' dog = 7'); // this should equal 7
mouse(x);
}
// SHARED FUNCTION
function mouse(x) {
console.log(x + ' mouse = cat() and/or dog()'); // I want this to equal 3 for cat() and 7 for dog() just as it is with x defined inside cat() and dog().
}
console.log(options.x + ' final global scope check = 10'); // I want this to remain 10, not 3. But the changes in cat() are poluting the global definition of options.x.
Я никогда не делал этого сам, но знаю, что вы можете скомпилировать код C # в dll, а затем загрузить dll и сослаться на нее в своем проекте VB.
From ] «Вызов класса C # в VB.net» :
Я думаю, что код C #, который вы хотите использование должно быть скомпилировано как DLL. однажды это сделано, просто добавьте ссылку к этому проекту на ваш VB.Net проекта, импортируйте пространство имен, которое вы нужно, а затем вы можете использовать C # код.
См. также Как: создавать и использовать библиотеки C # DLL (из MSDN, для VS2005)
Я просто хочу знать, можно ли использовать и VB, и C # в одном проекте.
Нет, не в одном проекте . С другой стороны, вы можете использовать их в том же решении .
Или я могу включить модуль, написанный на C #, в свой проект VB.net.
Я предлагаю вам создать решение, содержащее два проекта: один на C #, который формирует библиотеку, которую вы используете из своего проекта VB. Это просто, легко поддерживать и легко расширять.
Если вы планировали использовать модуль только в проектах Visual Basic, вам следует подумать о преобразовании кода только в Visual Basic. Если вам нужно использовать модуль как в C #, так и в VB.NET программах, я бы использовал одно из описанных выше решений
Вы можете попробовать что-то вроде * Convert C # to VB.NET . Он преобразует C # в код VB.NET. Я использую эту страницу исключительно, когда мне нужно преобразовать что-то, что я нахожу в сети, написанное на C #.
Вы также хотите убедиться, что ваш код C # соответствует CLS. Это означает, что он не будет публично раскрывать какие-либо функции, которые другие языки .NET не будут понимать (например, целые числа без знака, которых нет в VB, или разные классы только по регистру, поскольку VB не чувствителен к регистру). Для этого вам нужно добавить атрибут, чтобы компилятор выдавал ошибки, если вы нарушили какие-либо правила. В этой статье показано, как это сделать:
Атрибут CLSCompliantAttribute может применяться к сборкам, модулям, типы и члены.
Для маркировки всей сборки как CLS-совместимой следующий синтаксис используется
using System; [сборка: CLSCompliant (true)]
Для маркировки определенного метода как CLS-совместимого используется следующий синтаксис используется
[Соответствует CLSC (верно)] public void MyMethod () `
Поместите код VB.NET и C # в отдельные проекты. (Я использую как VB.NET, так и C # в моем проекте с открытым исходным кодом http://msquant.sourceforge.net/ , и он отлично работает).
Вам не нужно беспокоиться о библиотеках DLL, просто обратитесь к проекту (используйте вкладку «Проект» в диалоговом окне «Добавить ссылку»). Например, если вам нужно использовать функцию в коде / проекте C #, добавьте ссылку из проекта VB.NET в проект C #.