Преобразование VBA в C # - PullRequest
       4

Преобразование VBA в C #

2 голосов
/ 27 октября 2010

Я сейчас нахожусь в процессе преобразования некоторых Excel VBA в C #, и я застрял на одном.

В VBA у меня есть некоторые открытые переменные, объявленные в верхней части модуля, вне функций, и я могу получить доступ и изменить их из любого модуля или функции.Пример:

Модуль A:

    public A As Double
    public B As Double

    Public Function Add (double a, double b)

Dim C As Double

C = A+B

End Function

Модуль B:

Public E As Double
Public Function Subtract(double D)

E = D - Add.C

End Function

Может кто-нибудь помочь мне повторить это в C #?

Ответы [ 3 ]

2 голосов
/ 27 октября 2010

Замечу, что ваш код не компилируется в VBA и даже не логичен.Итак, мой пример ниже - предположение ... Вы действительно должны быть внимательнее, задавая вопросы здесь.

Примечание: .NET - современный язык (в отличие от VBA), он ориентирован наЯдро и не включает в себя понятие глобальных переменных функций, как это часто используется в программировании VBA.Это относится и к C #, и к VB.NET.

В .NET весь ваш код упакован в классы (хорошо, структуры и перечисления), в отличие от модулей.

Однако стандартные модули VBA преобразуются в статические классы в .NET.Итак, чтобы начать, вы можете сделать это.Но в целом это плохой дизайн.Или, скорее, хороший способ создания ошибок.

С этим предупреждением вы можете сделать что-то вроде:

namespace MyMultivaluedUniverse
{
    // As these classes are static, all methods and properties need to be static too.
    public static class MyUniverse 
    {
        public static double A { get; set; } // shortcut notation for properties .NET 2+
        public static double B { get; set; }

        public static double Add() // If you are just adding your Properties A and B, no need for this method to have parameters
        {
            return A + B;
        }
    }

    public static class MyWorld
    {
        public static double E { get; set; }
        public static double Subtract(double D)
        {
            E = D - MyUniverse.Add(); // Note how I specify the class name before the method:  this works only for static methods
            return E;
        }
    }

    // This class is not static, so doesn't need static everywhere
    public class MyHome
    {
        public double Arithmetic(double F)
        {
            return MyUniverse.Add() - MyWorld.Subtract(F); // will trivially equal F
        }
    }

    public class MySelf
    {
        MyHome mh = new MyHome(); // shows how to instantiate a non static class and use it
        public double DoWork(double G)
        {
            return mh.Arithmetic(G); // I precede the method name with the Instance name.
        }
    }
}
0 голосов
/ 27 октября 2010

Наиболее близким к модулю в C # будет public static class, который может содержать public static переменных-членов. Хотя, как говорит Лазарь, было бы лучше, если это возможно, реорганизовать ваш код.

Посмотрите эту страницу MSDN для получения дополнительной информации и примеров: Статические классы и члены статических классов (Руководство по программированию в C #)

0 голосов
/ 27 октября 2010

Насколько я знаю, вы не можете иметь глобальные переменные в C #, это плохая практика. Постарайтесь реструктурировать свои функции, чтобы избежать необходимости в глобальных переменных, передав все необходимые данные в функцию в качестве параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...