MA.Norouzifar Ответов: 2

Чем отличается (private vs public ) в этом коде (new lis<cartline> )


ПРИВЕТ
Я использую Asp.net сердечник в MVC 2 в формате PDF для изучения основных asp.net 2

в этой книге используется сессия для хранения списка товаров в карточке. Теперь у меня есть два кода со следующим :

первый код :
private List lineCollection = new List();

второй :
Public List lineCollection = new List();


когда я использовал Firs Code (private), все вещи работали правильно ... Но я не знаю, что произошло, когда я использую второй код (публичный) список, который не работает правильно .. когда я нажимаю кнопку "добавить товар в корзину", то один товар добавляется в список правильных . но когда я хочу увидеть список Картлайн в индексе CartController, я вижу два продукта в списке, но я добавляю только один продукт, а не два продукта, или когда я хочу удалить этот продукт из списка, он не удаляется из списка ...

полная тележка класса :
public class Cart
    {
        
       // public List lineCollection = new List();
        private List lineCollection = new List();
        public virtual void AddItem(Product product, int quantity)
        {
            CartLine line = lineCollection
            .Where(p => p.Product.ProductID == product.ProductID)
            .FirstOrDefault();
            if (line == null)
            {
                lineCollection.Add(new CartLine
                {
                    Product = product,
                    Quantity = quantity
                });
            }
            else
            {
                line.Quantity += quantity;
            }
        }

        //Remove All Products in Cart
        public virtual void RemoveLine(Product product)
            => lineCollection.RemoveAll(l => l.Product.ProductID == product.ProductID);
        //Compute Total in Cart
        public virtual decimal ComputeTotalValue()
            => lineCollection.Sum(e => e.Product.Price * e.Quantity);

        public virtual void Clear() => lineCollection.Clear();

        public virtual IEnumerable Lines => lineCollection;
    }


и полная тележка класса контроллера:
public class CartController : Controller
    {

        private IProductRepository repository;
        private Cart Cart;
        public CartController(IProductRepository repo,Cart cart)
        {
            repository = repo;
            Cart = cart;
        }

        public ViewResult Index(string returnUrl)
        {
            return View(new CartIndexViewModel
            {
                //Cart = GetCart(),
                Cart = Cart,
                ReturnUrl = returnUrl
            });
        }
        public RedirectToActionResult AddToCart(int productId,string returnUrl)
        {
            Product product = repository.Products.FirstOrDefault(p=>p.ProductID==productId);
            if (product!=null)
            {
                //Cart cart = GetCart();
               
                //cart.AddItem(product, 1);
               // SaveCart(cart);
               Cart.AddItem(product, 1);
            }
            return RedirectToAction("Index", new { returnUrl });
        }

        public RedirectToActionResult RemoveFromCart(int productId,string returnUrl)
        {
            Product product = repository.Products
            .FirstOrDefault(p => p.ProductID == productId);
            if (product != null)
            {
                //Cart cart = GetCart();
                //cart.RemoveLine(product);
                //SaveCart(cart);
                Cart.RemoveLine(product);
            }
            return RedirectToAction("Index", new { returnUrl });
        }
     

    }


и расширение учебного занятия:
public static class SessionExtensions
    {
        public static void SetJson(this ISession session,string key,object value)
        {
            session.SetString(key, JsonConvert.SerializeObject(value));

        }

        public static T GetJson(this ISession session,string key)
        {
            var sessiondata = session.GetString(key);
            return sessiondata == null ? default(T) : JsonConvert.DeserializeObject(sessiondata);
        }
    }


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

Что я уже пробовал:

я только что сменил Public на private, и весь код работает правильно, я не знаю почему?

2 Ответов

Рейтинг:
2

MA.Norouzifar

Танки для ответа

я знаю о пуплике,Привате,защите .....

Но в моем коде я никогда не использую List<cartline> В другом классе я просто использовал их в самом классе

посмотрите мой пример кода : PackagesStore


Richard Deeming

Если вы хотите ответить на решение, нажмите кнопку "есть вопрос или комментарий?" кнопка под раствором.

НЕ опубликуйте свой комментарий как новое решение!

Рейтинг:
13

OriginalGriff

Если вы объявите что-либо (не просто список, а что угодно: целое число, метод, даже целый класс) как private тогда он доступен только внутри класса, в котором он определен - мир вне класса не может видеть его или получить к нему прямой доступ каким-либо образом.

public class MyClass
    {
    private List<string> myList = new List<string>();
    public string GetAt(int index)
        {
        if (index >= 0 && index < myList.Count)     // Fine, it's in the same class.
            {
            return myList[index];                   // Fine, it's in the same class.
            }
        return null;
        }
    }
public class MyOtherClass
    {
    public void DoSomething()
        {
        MyClass mc = new MyClass();                 // Fine, MyClass is public
        mc.GetAt(1);                                // Fine, MyClass.GetAt is public
        mc.myList.Add("Hello");                     // Error: "'GeneralTesting.frmMain.MyClass.myList' is inaccessible due to its protection level"
        }
    }

Когда вы объявляете что-то как public весь мир может увидеть его и получить к нему доступ.

Есть и другие модификаторы доступа (internal, protected , и protected internal но с ними вы познакомитесь позже.